题目:

Tiger最近被公司升任为营业部经理,他上任后接受公司交给的第一项任务便是统计并分析公司成立以来的营业情况。

Tiger拿出了公司的账本,账本上记录了公司成立以来每天的营业额。分析营业情况是一项相当复杂的工作。由于节假日,大减价或者是其他情况的时候,营业额会出现一定的波动,当然一定的波动是能够接受的,但是在某些时候营业额突变得很高或是很低,这就证明公司此时的经营状况出现了问题。经济管理学上定义了一种最小波动值来衡量这种情况:
该天的最小波动值 = min {该天以前某一天的营业额 - 该天营业额}
当最小波动值越大时,就说明营业情况越不稳定。
而分析整个公司的从成立到现在营业情况是否稳定,只需要把每一天的最小波动值加起来就可以了。你的任务就是编写一个程序帮助Tiger来计算这一个值。
第一天的最小波动值为第一天的营业额。
天数小于100000.

输入

第一行为正整数 ,表示该公司从成立一直到现在的天数

接下来的n行每行有一个整数(一定有数据小于〇) ,表示第i天公司的营业额。

输出

输出文件仅有一个正整数,即每一天的最小波动值之和。答案保证在int范围内

营业额统计(SBT)

#include<cstdio>
#include<cstring>
#include<string>
#include<cstdlib>
using namespace std;
#define MAXN 100005
#define INF 10000000
int sz[MAXN],ch[MAXN][2],val[MAXN],root,fa[MAXN],n,cnt;
#define abs(a) ((a)>0?(a):-(a))
void rotato(int &r,bool flag)
{
int t=ch[r][!flag];
if(!t)return;
ch[r][!flag]=ch[t][flag];
ch[t][flag]=r;
sz[r]=sz[ch[r][0]]+sz[ch[r][1]]+1;
sz[t]=sz[ch[t][0]]+sz[ch[t][1]]+1;
r=t;
} void maintain(int &r,bool flag)
{
if(!flag)
{
if(sz[ch[ch[r][0]][0]]>sz[ch[r][1]])
rotato(r,1);
else if(sz[ch[ch[r][0]][1]]>sz[ch[r][1]])
{
rotato(ch[r][0],0);
rotato(r,1);
}
else return;
}
else
{
if(sz[ch[ch[r][1]][1]]>sz[ch[r][0]])
rotato(r,0);
else if(sz[ch[ch[r][1]][0]]>sz[ch[r][0]])
{rotato(ch[r][1],1);
rotato(r,0);
}
else return;
}
maintain(ch[r][0],0);
maintain(ch[r][1],1);
maintain(r,0);
maintain(r,1);
}
void insert(int &r,int t)
{
if(!r)
{
cnt++;
val[cnt]=t;
sz[cnt]=1;
r=cnt;
return;
}
if(val[r]==t)
return;
else if(val[r]>t)
insert(ch[r][0],t);
else insert(ch[r][1],t);
maintain(r,t>=val[r]);
}
int find(int r,int t)
{
int ans=INF;
while(r)
{
if(abs(val[r]-t)<ans)
ans=abs(val[r]-t);
if(t<val[r])
r=ch[r][0];
else if(t>val[r])
r=ch[r][1];
else
break;
}
return ans;
}
int main()
{
int t,ans=0;
scanf("%d",&n);
for(int i=1;i<=n;i++)
{
scanf("%d",&t);
if(i>1)
{
int tmp=find(root,t);
ans+=tmp;
}
else ans=t;
insert(root,t);
}
printf("%d\n",ans);
return 0;
}

  

AVL代码:

#include <iostream>
#include<cstdio>
#include<cstring>
#include<cstdlib>
using namespace std;
#define MAXN 100005
#define INF 123456789
int ans,tmpdiff=INF,cnt,root,dayv;
struct node
{
int lch,rch,num,h;
}tree[MAXN];
int sum;
int n,m;
void zig(int &r)
{
int t=tree[r].lch;
tree[r].lch=tree[t].rch;
tree[t].rch=r;
tree[r].h=max(tree[tree[r].lch].h,tree[tree[r].rch].h)+1;
tree[t].h=max(tree[tree[t].lch].h,tree[tree[t].rch].h)+1;
r=t;
}
void zag(int &r)
{
int t=tree[r].rch;
tree[r].rch=tree[t].lch;
tree[t].lch=r;
tree[r].h=max(tree[tree[r].lch].h,tree[tree[r].rch].h)+1;
tree[t].h=max(tree[tree[t].lch].h,tree[tree[t].rch].h)+1;
r=t;
}
void insert(int &root,int x)
{
if(root==0)
{
tree[++cnt].num=x;
tree[cnt].h=1;
root=cnt;
return;
}
tmpdiff=min(tmpdiff,abs(x-tree[root].num));
if(x<tree[root].num)
insert(tree[root].lch,x);
else if(x>tree[root].num)
insert(tree[root].rch,x);
else return;
tree[root].h=max(tree[tree[root].lch].h,tree[tree[root].rch].h)+1;
if(tree[tree[root].lch].h-tree[tree[root].rch].h>1)
{
if(x<tree[tree[root].lch].num)
{
zig(root);
}
else
{
zag(tree[root].lch);
zig(root);
}
}
else if(tree[tree[root].rch].h-tree[tree[root].lch].h>1)
{
if(x>tree[tree[root].rch].num)
zag(root);
else
{
zig(tree[root].rch);
zag(root);
}
}
tree[root].h=max(tree[tree[root].lch].h,tree[tree[root].rch].h)+1;
}
int main()
{
scanf("%d",&n);
for(int i=1;i<=n;i++)
{
scanf("%d",&dayv);
if(i==1)ans+=dayv;
tmpdiff=INF;
insert(root,dayv);
if(tmpdiff!=INF)
ans+=tmpdiff; }
printf("%d",ans);
return 0;
}

  

营业额统计(SBT)的更多相关文章

  1. BZOJ1588: [HNOI2002]营业额统计[BST]

    1588: [HNOI2002]营业额统计 Time Limit: 5 Sec  Memory Limit: 162 MBSubmit: 14151  Solved: 5366[Submit][Sta ...

  2. 【Treap】bzoj1588-HNOI2002营业额统计

    一.题目 Description 营业额统计 Tiger最近被公司升任为营业部经理,他上任后接受公司交给的第一项任务便是统计并分析公司成立以来的营业情况. Tiger拿出了公司的账本,账本上记录了公司 ...

  3. NOI 2002 营业额统计 (splay or fhq treap)

    Description 营业额统计 Tiger最近被公司升任为营业部经理,他上任后接受公司交给的第一项任务便是统计并分析公司成立以来的营业情况. Tiger拿出了公司的账本,账本上记录了公司成立以来每 ...

  4. BZOJ 1588: [HNOI2002]营业额统计

    1588: [HNOI2002]营业额统计 Time Limit: 5 Sec  Memory Limit: 162 MBSubmit: 14396  Solved: 5521[Submit][Sta ...

  5. 营业额统计(bzoj1588)

    Description 营业额统计 Tiger最近被公司升任为营业部经理,他上任后接受公司交给的第一项任务便是统计并分析公司成立以来的营业情况. Tiger拿出了公司的账本,账本上记录了公司成立以来每 ...

  6. BZOJ 1588: [HNOI2002]营业额统计 双向链表 / splay / treap

    1588: [HNOI2002]营业额统计 Description 营业额统计 Tiger最近被公司升任为营业部经理,他上任后接受公司交给的第一项任务便是统计并分析公司成立以来的营业情况. Tiger ...

  7. Splay树-Codevs 1296 营业额统计

    Codevs 1296 营业额统计 题目描述 Description Tiger最近被公司升任为营业部经理,他上任后接受公司交给的第一项任务便是统计并分析公司成立以来的营业情况. Tiger拿出了公司 ...

  8. 【BZOJ-1588】营业额统计 Splay

    1588: [HNOI2002]营业额统计 Time Limit: 5 Sec  Memory Limit: 162 MBSubmit: 12485  Solved: 4508[Submit][Sta ...

  9. BZOJ1588 HNOI2002 营业额统计 [Splay入门题]

    [HNOI2002]营业额统计 Time Limit: 5 Sec  Memory Limit: 162 MBSubmit: 4128  Solved: 1305 Description 营业额统计 ...

随机推荐

  1. SQLHelper

    今天学习了.net后,经过老师的一番讲解,似乎对它越来越渴望了,希望自己在接下来的学习当中,能很好的驾驭.net,加油吧, 下面我分享一个操作SQL数据库的代码大全,谢谢观赏.嘿嘿,还是比较长的哦, ...

  2. UE4 VR GUI实现 参考(UMG AND VR)

    Note:4.13以后版本VR UI采用 WidgetComponent + WidgetInteractionComponent可轻松实现交互 Blueprint Demo: https://for ...

  3. java java.lang.NoClassDefFoundError 的解决办法

    以简单而经典的 "HelloWorld.java" 为例 不含包层次的HelloWorld.Java public class HelloWorld { public static ...

  4. 1、MVC和EF中的 Model First 和 Code First

    准备:先引入MVC和EF的dll包 *命令方法:打开工具——库程序包管理器——程序包管理器控制台,选择自己的项目 a)     Install-Package EntityFramework -Ver ...

  5. web api 初体验 解决js调用跨域问题

    跨域界定 常见跨域: 同IP不同端口: http:IP:8001/api/user     http:IP:8002/api/user 不同IP不同端口: http://172.28.20.100:8 ...

  6. 一道google面试题

    输入n,把1-n分成两个和相等的子集,有多少种分法 想了个dp,直接背包也行 #include <iostream> #include <cstdio> using names ...

  7. web页面放到手机页面,缩放问题

    有时候写页面样式不规范,很多页面元素写死尺寸时,web页面尺寸比较大放到移动端访问时,就背缩放了,div或者按钮变得好小 可以加段js,效果会好点 <script> ! function( ...

  8. 缓存和sd卡的路径(原)

    在需要存储的时候,路径的问题是初学者比较迷惑的,下面是对于getCacheDir().getFilesDir().getExternalFilesDir().getExternalCacheDir() ...

  9. 解析C语言结构体对齐(内存对齐问题)

    C语言结构体对齐也是老生常谈的话题了.基本上是面试题的必考题.内容虽然很基础,但一不小心就会弄错.写出一个struct,然后sizeof,你会不会经常对结果感到奇怪?sizeof的结果往往都比你声明的 ...

  10. Java笔记9-正则表达式

    提纲: 1.正则表达式 2.常见的异常 3.内部类------------------------------------------------------------------JDK 1.4以后 ...