[BZOJ 1588] [HNOI 2002] 营业额统计
2015-06-16 21:12
295 查看
1588: [HNOI2002]营业额统计
Time Limit: 5 SecMemory Limit: 162 MBDescription
营业额统计 Tiger最近被公司升任为营业部经理,他上任后接受公司交给的第一项任务便是统计并分析公司成立以来的营业情况。 Tiger拿出了公司的账本,账本上记录了公司成立以来每天的营业额。分析营业情况是一项相当复杂的工作。由于节假日,大减价或者是其他情况的时候,营业额会出现一定的波动,当然一定的波动是能够接受的,但是在某些时候营业额突变得很高或是很低,这就证明公司此时的经营状况出现了问题。经济管理学上定义了一种最小波动值来衡量这种情况: 该天的最小波动值 当最小波动值越大时,就说明营业情况越不稳定。 而分析整个公司的从成立到现在营业情况是否稳定,只需要把每一天的最小波动值加起来就可以了。你的任务就是编写一个程序帮助Tiger来计算这一个值。 第一天的最小波动值为第一天的营业额。 输入输出要求Input
第一行为正整数 ,表示该公司从成立一直到现在的天数,接下来的n行每行有一个整数(有可能有负数) ,表示第i天公司的营业额。Output
输出文件仅有一个正整数,即Sigma(每天最小的波动值) 。结果小于2^31 。Sample Input
65
1
2
5
4
6
Sample Output
12HINT
结果说明:5+|1-5|+|2-1|+|5-5|+|4-5|+|6-5|=5+4+1+0+1+1=12此题数据有问题,详见讨论版http://www.lydsy.com/JudgeOnline/wttl/wttl.php?pid=1588
【题解】
用平衡树来维护插入等操作即可。
平衡树第二题 AC
事实证明,zig,zag分开来写会更快=-=
#include<bits/stdc++.h> using namespace std; const int N=40010; int fa ,ch [2],root,k ,ind=1; void zig(int x) { int y=fa[x],z=fa[y]; fa[y]=x; fa[x]=z; ch[y][0]=ch[x][1],fa[ch[x][1]]=y,ch[x][1]=y; if (y==ch[z][0]) ch[z][0]=x; else ch[z][1]=x; //size[y]=size[ch[y][0]]+size[ch[y][1]]+1; } void zag(int x) { int y=fa[x],z=fa[y]; fa[y]=x,fa[x]=z; ch[y][1]=ch[x][0],fa[ch[x][0]]=y,ch[x][0]=y; if (y==ch[z][0]) ch[z][0]=x; else ch[z][1]=x; //size[y]=size[ch[y][0]]+size[ch[y][1]]+1; } void splay(int x,int s) { while (fa[x]!=s) { int y=fa[x],z=fa[y]; if (z==s) { if (x==ch[y][0]) zig(x); else zag(x); break; } if (y==ch[z][0]) { if (x==ch[y][0]) zig(y),zig(x); else zag(x),zig(x); } else { if (x==ch[y][1]) zag(y),zag(x); else zig(x),zag(x); } } //size[x]=size[ch[x][0]]+size[ch[x][1]]+1; if (s==0) root=x; } inline void newnode(int &x,int fax,int key) { x=++ind; ch[x][0]=ch[x][1]=0; fa[x]=fax; k[x]=key; } inline int search(int w) { int p,x=root; while(x) { p=x; if(k[x]>w) x=ch[x][0]; else x=ch[x][1]; } return p; } inline void ins(int w){ if (root==0) { newnode(root,0,w); return ; } int i=search(w); if(w<k[i]) newnode(ch[i][0],i,w); else newnode(ch[i][1],i,w); splay(ind,0); } inline int pre(int x) { int tmp=ch[x][0]; while(ch[tmp][1]) tmp=ch[tmp][1]; return k[tmp]; } inline int suc(int x) { int tmp=ch[x][1]; while(ch[tmp][0]) tmp=ch[tmp][0]; return k[tmp]; } int main() { int n,t,ans=0; scanf("%d%d",&n,&t); root=1;k[root]=t; ch[root][0]=ch[root][1]=0; fa[root]=0;//printf("hhh"); ans=t;ins(2100000); ins(-2100000); for (int i=2;i<=n;++i) { if(scanf("%d",&t)==EOF) t=0; ins(t); int a=pre(root),b=suc(root); ans+=min(t-a,b-t); } printf("%d\n",ans); return 0; }
View Code
相关文章推荐
- UnigramProbability API
- awk内置变量的应用
- RHEL 6.3安装(超级详细图解教程)
- 一起talk C栗子吧(第十八回:C语言实例--输出十六进制)
- Memcache(MC)系列(六)Memcache内存分配策略
- hdu2993坡dp+二进制搜索
- 团队站立会议10(第二阶段)
- NGramBuffer API
- Fleury(弗罗莱)算法求欧拉路径
- java.lang.NoSuchMethodException: com.sun.proxy.$Proxy24.newSysUser()解决方案
- 快速排序和随机快速排序
- Memcache(MC)系列(五)使用memcache-top监控memcache集群状态
- java中的StringBuffer和StringBuilder
- LargeNGramModel API 语言模型
- TRIE树在输入法分词的应用
- 对于每一个Linux学习者来说,了解Linux文件系统的目录结构,是学好Linux的至关重要的一步.,深入了解linux文件目录结构的标准和每个目录的详细功能,对于我们用好linux系统只管重要,下面
- 指针数组,数组指针,二级指针,二维数组的关系
- 坚持坚持
- 悼念传奇,约翰询问·纳什和他的妻子艾丽西亚致敬,创建一个传奇,爱数学
- leetcode[27]:Remove Element