HNOI 2002 营业额统计(Splay树)
来源:互联网 发布:软件报价单模板 lic 编辑:程序博客网 时间:2024/06/06 07:48
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
6
5
1
2
5
4
6
5
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=12
Splay树的插入题
代码:
#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; }
阅读全文
0 0
- HNOI 2002 营业额统计(Splay树)
- HNOI 2002 营业额统计(Splay入门)
- 【HNOI 2002 】营业额统计(splay)
- hnoi 2002 营业额统计(splay入门题)
- HNOI 2002 营业额统计 Splay Tree
- HNOI 2002 营业额统计 Splay解法
- BZOJ 1588 [HNOI 2002] 营业额统计 Splay
- splay bzoj 1588 营业额统计(HNOI 2002)
- HNOI 2002 营业额统计
- [HNOI 2002]营业额统计
- 【Treap】[HNOI 2002]营业额统计
- [BZOJ1588]营业额统计(平衡树splay)
- [HNOI2002] 营业额统计(平衡树splay)
- 【BZOJ 1588】【HNOI 2002】营业额统计(treap模板题)
- CJOJ 1308 【HNOI 2002 】营业额统计 / CodeVS 1296 营业额统计
- [BZOJ 1588] HNOI 2002 营业额统计
- BZOJ 1588 [HNOI 2002] 营业额统计
- HNOI营业额统计
- Linux学习(三)Shell编程
- 【手记】小心在where中使用NEWID()的大坑
- 7219:复杂的整数划分问题
- 禁用某软件开机启动
- 机器学习-矩阵向量求导
- HNOI 2002 营业额统计(Splay树)
- mysql启动的四种方式
- 算法记录:击鼓传花问题c语言实现
- KD-Tree学习笔记
- storyboard 构建多tab页应用程序
- Eclipse+Java调用中科院分词系统ICTCLAS2016
- fread 快速读入
- 线性链表的是否带头结点问题
- 知道这20个正则表达式,能让你少写1000行代码