数据结构:(平衡树,链表)BZOJ 1588[HNOI2002]营业额统计
2016-02-20 10:49
477 查看
1588: [HNOI2002]营业额统计
Time Limit: 5 Sec Memory Limit: 162 MBSubmit: 12173 Solved: 4354
[Submit][Status][Discuss]
Description
营业额统计 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
此题题面很简单,就是求序列的每一个数与其前面的数中最小的差值。用线段树是可做的,我这里用了Splaytree。
#include <iostream> #include <cstdio> #include <cstring> #include <cmath> #include <algorithm> using namespace std; const int maxn=1e6; int key[maxn],ch[maxn][2],fa[maxn],root,cnt; void Rotate(int x) { int y=fa[x],g=fa[y],c=ch[y][1]==x; ch[y][c]=ch[x][c^1];ch[x][c^1]=y; fa[ch[y][c]]=y;fa[y]=x;fa[x]=g; if(g) ch[g][ch[g][1]==y]=x; } void Splay(int x) { for(int y;y=fa[x];Rotate(x)) if(fa[y]) Rotate((ch[fa[y]][1]==y)==(ch[y][1]==x)?y:x); root=x; } void Insert(int x) { if(!root){ root=++cnt; key[cnt]=x; return; } int p=root,pre; while(p) { pre=p; p=ch[p][key[p]<x]; } p=++cnt;fa[p]=pre; ch[pre][key[pre]<x]=p; key[p]=x; Splay(p); } int Ql(int x) { int p=root,ret=-1000000000; while(p){ if(key[p]<=x){ ret=max(ret,key[p]); p=ch[p][1]; } else p=ch[p][0]; } return ret; } int Qr(int x) { int p=root,ret=1000000000; while(p){ if(key[p]>=x){ ret=min(ret,key[p]); p=ch[p][0]; } else p=ch[p][1]; } return ret; } int main() { int n,ans=0; scanf("%d",&n); for(int i=1;i<=n;i++) { int x=0; scanf("%d",&x); if(i==1){ ans=x; Insert(x); continue; } int l=Ql(x); int r=Qr(x); ans+=min(x-l,r-x); Insert(x); } printf("%d\n",ans); return 0; }
#include <algorithm> #include <iostream> #include <cstring> #include <cstdio> #include <cmath> using namespace std; const int maxn=50010; int n,a[maxn],p[maxn],rp[maxn],l[maxn],r[maxn]; bool cmp(int x,int y){ return a[x]<a[y]; } int main(){ #ifndef ONLINE_JUDGE freopen("turnover.in","r",stdin); freopen("turnover.out","w",stdout); #endif scanf("%d",&n); for(int i=1;i<=n;i++){ scanf("%d",&a[i]); p[i]=i; } int ans=a[1]; sort(p+1,p+n+1,cmp); for(int i=1;i<=n;i++){ l[i]=i-1;r[i]=i+1; rp[p[i]]=i; } l[1]=n;r =1; for(int i=n;i>=2;i--){ ans+=min(abs(a[i]-a[p[l[rp[i]]]]),abs(a[p[r[rp[i]]]]-a[i])); r[l[rp[i]]]=r[rp[i]]; l[r[rp[i]]]=l[rp[i]]; } printf("%d\n",ans); return 0; }
相关文章推荐
- poj 1988(并查集)
- [置顶]C#中使用Redis不同数据结构的内存占有量的疑问和对比测试
- SDUT_2141_数据结构实验图论一:基于邻接矩阵的广度优先搜索遍历
- Python中的数据结构和面向对象设计模式的算法
- 数据结构基础之串
- 数据结构基础之队列
- MySQL索引背后的数据结构及算法原理
- nginx源码初读(2)--让烦恼从数据结构开始(ngx_buf/ngx_chain)
- 数据结构与算法——图
- poj 1451(Trie)
- iOS学习_Lesson01_数据结构
- 关于VFS文件系统中的superblock、inode、d_entry和file数据结构
- Redis中5种数据结构的使用场景介绍
- Redis中5种数据结构的使用场景介绍
- 《数据结构与算法分析(c 描述)》—— 第二章笔记
- 数据结构之栈(四)
- HDU 5479 Scaena Felix(简单的数据结构题目)
- 《数据结构与算法分析(c 描述)》—— 第一章笔记
- c++ 数据结构 哈夫曼树
- poj 1195(二维树状数组)