HNOI 2002 营业额统计(Splay树)
2017-08-27 12:06
411 查看
1588: [HNOI2002]营业额统计
Time Limit: 5 Sec Memory Limit: 162 MBSubmit: 6923 Solved: 2286
[Submit][Status]
Description
营业额统计 Tiger最近被公司升任为营业部经理,他上任后接受公司交给的第一项任务便是统计并分析公司成立以来的营业情况。 Tiger拿出了公司的账本,账本上记录了公司成立以来每天的营业额。分析营业情况是一项相当复杂的工作。由于节假日,大减价或者是其他情况的时候,营业额会出现一定的波动,当然一定的波动是能够接受的,但是在某些时候营业额突变得很高或是很低,这就证明公司此时的经营状况出现了问题。经济管理学上定义了一种最小波动值来衡量这种情况: 该天的最小波动值 当最小波动值越大时,就说明营业情况越不稳定。 而分析整个公司的从成立到现在营业情况是否稳定,只需要把每一天的最小波动值加起来就可以了。你的任务就是编写一个程序帮助Tiger来计算这一个值。第一天的最小波动值为第一天的营业额。 输入输出要求
Input
第一行为正整数 ,表示该公司从成立一直到现在的天数,接下来的n行每行有一个正整数 ,表示第i天公司的营业额。
Output
输出文件仅有一个正整数,即Sigma(每天最小的波动值) 。结果小于2^31 。
Sample Input
65
1
2
5
4
6
Sample Output
12
HINT
结果说明:5+|1-5|+|2-1|+|5-5|+|4-5|+|6-5|=5+4+1+0+1+1=12Splay树的插入题
代码:
#include <stdio.h> #include <algorithm> #include <math.h> using namespace std; struct node{ int father,left,right,data; }tree[100008]; int time=0,n,root,sum=0; void rightrotate(int x) { int y=tree[x].father; int z=tree[y].father; tree[y].left=tree[x].right; if(tree[x].right!=-1) { tree[tree[x].right].father=y; } tree[x].father=z; if(z!=-1) { if(tree[z].left==y) tree[z].left=x; else tree[z].right=x; } tree[x].right=y; tree[y].father=x; } void leftrotate(int x) { int y=tree[x].father; int z=tree[y].father; tree[y].right=tree[x].left; if(tree[x].left!=-1) { tree[tree[x].left].father=y; } tree[x].father=z; if(z!=-1) { if(tree[z].left==y) tree[z].left=x; else tree[z].right=x;} tree[x].left=y; tree[y].father=x; } void splay(int x) { while(tree[x].father!=-1) { int y=tree[x].father; int z=tree[y].father; if(z==-1) { if(tree[y].left==x) rightrotate(x); else leftrotate(x); } else { if(tree[z].left==y&&tree[y].left==x) { rightrotate(y); rightrotate(x); } else if(tree[z].left==y&&tree[y].right==x) { leftrotate(x); rightrotate(x); } else if(tree[z].right==y&&tree[y].right==x) { leftrotate(y); leftrotate(x); } else { rightrotate(x); leftrotate(x); } } } root=x; } int qq(int x) { int y=tree[x].left; if(y==-1) return -1; while(tree[y].right!=-1) y=tree[y].right; return y; } int hj(int x) { int y=tree[x].right; if(y==-1) return -1; while(tree[y].left!=-1) y=tree[y].left; return y; } bool BST_insert(int dat,int x) { if(dat==tree[x].data) { splay(x);//提升到根节点 return false; } if(dat<tree[x].data) { if(tree[x].left==-1) { tree[x].left=time; tree[time].father=x; tree[time].left=tree[time].right=-1; tree[time].data=dat; return true; } else BST_insert(dat,tree[x].left); } else { if(tree[x].right==-1) { tree[x].right=time; tree[time].father=x; tree[time].left=tree[time].right=-1; tree[time].data=dat; return true; } else BST_insert(dat,tree[x].right); } } void insert(int dat) { time++; if(!BST_insert(dat,root)) return ; splay(time); int q=qq(time); int h=hj(time); int Min=100000000; if(q!=-1) Min=min(Min,abs(tree[q].data-dat)); if(h!=-1) Min=min(Min,abs(tree[h].data-dat)); sum+=Min; } int main() { int n,a1; while(scanf("%d",&n)!=-1) { sum=0; time=0; scanf("%ld",&a1); sum=a1; time++; tree[time].father=-1; tree[time].left=tree[time].right=-1; tree[time].data=a1; root=time; for(int i=1;i<=n-1;i++) { int dats=0; scanf("%ld",&dats); insert(dats); } printf("%ld\n",sum); } return 0; }
相关文章推荐
- bzoj 1588 hnoi2002营业额统计 splay
- HNOI2002 营业额统计(SBT模板题&splay解法)
- [HNOI2002]营业额统计 【splay无初始数组,单点插入找最值】
- HYSBZ 1588: [HNOI2002]营业额统计(splay)
- 1588: [HNOI2002]营业额统计 (splay模板)
- HNOI2002 营业额统计 splay
- Splay入门题+1588: [HNOI2002]营业额统计
- hnoi 2002 营业额统计(splay入门题)
- bzoj1588: [HNOI2002]营业额统计 SBT&&Splay
- [bzoj1588][HNOI2002]营业额统计——splay
- 两道Splay小结--bzoj1112: [POI2008]砖块Klo&bzoj1588: [HNOI2002]营业额统计
- [Bzoj1588][HNOI2002]营业额统计 (Treap|Splay)
- bzoj 1588 [HNOI2002]营业额统计 splay
- BZOJ 1588: [HNOI2002]营业额统计 双向链表 / splay / treap
- BZOJ 1588: [HNOI2002]营业额统计 Splay版(模板题)
- Splay入门题目 [HNOI2002]营业额统计
- bzoj1588 [HNOI2002]营业额统计 (Splay)
- BZOJ 1588 [HNOI2002]营业额统计(Splay)
- HNOI 2002 营业额统计(Splay入门)
- 【bzoj1588】[HNOI2002]营业额统计 Splay