bzoj1588 [HNOI2002]营业额统计 裸splay
2016-03-24 20:44
441 查看
Description
营业额统计 Tiger最近被公司升任为营业部经理,他上任后接受公司交给的第一项任务便是统计并分析公司成立以来的营业情况。 Tiger拿出了公司的账本,账本上记录了公司成立以来每天的营业额。分析营业情况是一项相当复杂的工作。由于节假日,大减价或者是其他情况的时候,营业额会出现一定的波动,当然一定的波动是能够接受的,但是在某些时候营业额突变得很高或是很低,这就证明公司此时的经营状况出现了问题。经济管理学上定义了一种最小波动值来衡量这种情况:该天的最小波动值 当最小波动值越大时,就说明营业情况越不稳定。 而分析整个公司的从成立到现在营业情况是否稳定,只需要把每一天的最小波动值加起来就可以了。你的任务就是编写一个程序帮助Tiger来计算这一个值。 第一天的最小波动值为第一天的营业额。 输入输出要求
Input
第一行为正整数 ,表示该公司从成立一直到现在的天数,接下来的n行每行有一个整数(有可能有负数) ,表示第i天公司的营业额。Output
输出文件仅有一个正整数,即Sigma(每天最小的波动值) 。结果小于2^31 。Sample Input
65
1
2
5
4
6
Sample Output
12终于学会了splay了,马上找个模板题试试手,只要找对应营业额的前驱和后继再减一减比较一下就可以了。
</pre><pre name="code" class="cpp">#include <iostream> #include <cstdio> #include <cstdlib> #include <algorithm> #include <cstring> #include <cmath> using namespace std; #define rt ch[root][1] #define lrt ch[rt][0] #define ls ch[x][0] #define rs ch[x][1] #define inf 0x7fffffff #define LL long long const int maxn=500100; int root,top; int ch[maxn][2],f[maxn]; LL sz[maxn],num[maxn],val[maxn],sum[maxn],add[maxn]; int n,m; inline void newnode(int &x,int fa,LL v) { x=++top; sz[x]=ls=rs=0; f[x]=fa; val[x]=v; } inline void pushup(int x) { sz[x]=sz[ls]+sz[rs]+1; } inline bool is(int x){return x==ch[f[x]][1];} void link(int y,int x,int d){f[x]=y;ch[y][d]=x;} inline void rotate(int x,int d) { int y=f[x],z=f[y]; link(y,ch[x][d],!d); if(z)link(z,x,is(y)); f[x]=z; link(x,y,d); pushup(y); } inline void zig(int x){rotate(x,1);} inline void zag(int x){rotate(x,0);} inline void splay(int x,int goal=0) { while(f[x]!=goal) { int y=f[x],z=f[y]; if(z==goal) { rotate(x,!is(x)); break; } if(ch[z][0]==y) { if(ch[y][0]==x)zig(y),zig(x); else zag(x),zig(x); } else{ if(ch[y][1]==x)zag(y),zag(x); else zig(x),zag(x); } } if(goal==0)root=x; pushup(x); } inline bool insert(LL v) { int x=root; while(ch[x][val[x]<v]) { if(val[x]==v) { splay(x); return 0; } x=ch[x][val[x]<v]; } newnode(ch[x][val[x]<v],x,v); splay(ch[x][val[x]<v]); return 1; } inline LL pre(int x) { x=ls; // if(x==0)return inf; while(rs)x=rs; return val[x]; } inline LL next(int x) { x=rs; // if(x==0)return inf; while(ls)x=ls; return val[x]; } int main() { scanf("%d",&n); root=top=0; ch[0][0]=ch[0][1]=f[0]=val[0]=sz[0]=0; newnode(root,0,-inf);//方便区间操作 newnode(rt,root,inf);//若不进行区间操作可以省略吗 sz[root]=2; LL v1,ans=0; pushup(rt),pushup(root); scanf("%lld",&v1); insert(v1); ans=v1; for(int i=2;i<=n;i++) { if(scanf("%lld",&v1)==-1)v1=0; if(insert(v1))ans+=min(fabs(pre(root)-v1),fabs(next(root)-v1)); } printf("%lld",ans); }
相关文章推荐
- 线程和进程
- MVC值提供组件和模型绑定组件
- 201603242031
- js传值到action出现中文乱码问题
- iOS 获取客户端ip
- JavaWeb
- python小程序
- java的服务端与客户端通信(1)
- Java问题总结之32-内存释放
- 非IDE方式手动配置struts2环境之hello_world
- 对大小端模式的学习
- 通过cookie保存并读取用户登录信息实例
- 3.24 58 数据挖掘intern
- Silicon Lab Ember zigbee学习杂谈----custom event
- 安卓应用程序框架研究(一):Activity组件的启动过程
- 学习JavaEE的每一天2016.3.24
- 通过数据得到拟合数据并制图
- css中一些常用选择器的介绍
- 直线分割平面、分割空间
- 堆排序