1588: [HNOI2002]营业额统计

Time Limit: 5 Sec  Memory Limit: 162 MB
Submit: 14396  Solved: 5521
[Submit][Status][Discuss]

Description

营业额统计 Tiger最近被公司升任为营业部经理,他上任后接受公司交给的第一项任务便是统计并分析公司成立以来的营业情况。 Tiger拿出了公司的账本,账本上记录了公司成立以来每天的营业额。分析营业情况是一项相当复杂的工作。由于节假日,大减价或者是其他情况的时候,营业额会出现一定的波动,当然一定的波动是能够接受的,但是在某些时候营业额突变得很高或是很低,这就证明公司此时的经营状况出现了问题。经济管理学上定义了一种最小波动值来衡量这种情况: 该天的最小波动值 当最小波动值越大时,就说明营业情况越不稳定。 而分析整个公司的从成立到现在营业情况是否稳定,只需要把每一天的最小波动值加起来就可以了。你的任务就是编写一个程序帮助Tiger来计算这一个值。 第一天的最小波动值为第一天的营业额。  输入输出要求

Input

第一行为正整数 ,表示该公司从成立一直到现在的天数,接下来的n行每行有一个整数(有可能有负数) ,表示第i天公司的营业额。

Output

输出文件仅有一个正整数,即Sigma(每天最小的波动值) 。结果小于2^31 。

Sample Input

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

该题数据bug已修复.----2016.5.15

Source

#include<cstdio>
#include<iostream>
#define EF if(ch==EOF) return x;
using namespace std;
const int N=1e5+;
const int inf=2e9;
int n,c[N][],fa[N],val[N],cnt[N],siz[N],rt,sz;
inline int read(){
int x=,f=;char ch=getchar();
while(ch<''||ch>''){if(ch=='-')f=-;EF;ch=getchar();}
while(ch>=''&&ch<=''){x=x*+ch-'';ch=getchar();}
return x*f;
}
void updata(int x){
siz[x]=siz[c[x][]]+siz[c[x][]]+cnt[x];
}
void rotate(int x,int &k){
int y=fa[x],z=fa[y],l,r;
l=(c[y][]==x);r=l^;
if(y==k) k=x;
else c[z][c[z][]==y]=x;
fa[x]=z;fa[y]=x;fa[c[x][r]]=y;
c[y][l]=c[x][r];c[x][r]=y;
updata(y);updata(x);
}
void splay(int x,int &k){
while(x!=k){
int y=fa[x],z=fa[y];
if(y!=k){
if((c[y][]==x)^(c[z][]==y)) rotate(x,k);
else rotate(y,k);
}
rotate(x,k);
}
}
#define l c[k][0]
#define r c[k][1]
void Rank(int v){
int k=rt;if(!rt) return ;
while(c[k][v>val[k]]&&val[k]!=v) k=c[k][v>val[k]];
splay(k,rt);
}
int kth(int rk){
rk++;int k=rt;
if(siz[k]<rk) return ;
for(;;){
if(siz[l]<rk&&siz[l]+cnt[k]>=rk) return val[k];
if(siz[l]>=rk) k=l;
else rk-=siz[l]+cnt[k],k=r;
}
}
void insert(int v){
int k=rt,y=;
while(k&&val[k]!=v) y=k,k=c[k][v>val[k]];
if(k) cnt[k]++;
else{
k=++sz;val[k]=v;siz[k]=cnt[k]=;fa[k]=y;
if(y) c[y][v>val[y]]=k;
}
splay(k,rt);
}
void erase(int v){
Rank(v);int k;
if(cnt[rt]>){cnt[rt]--;siz[rt]--;return ;}
if(!c[rt][]||!c[rt][]){
rt=c[rt][]+c[rt][];
fa[rt]=;
}
else{
k=c[rt][];
while(l) k=l;
siz[k]+=siz[c[rt][]];
fa[c[rt][]]=k;l=c[rt][];
rt=c[rt][];
fa[rt]=;
splay(k,rt);
}
}
int prev(int v){
Rank(v);
if(val[rt]<=v) return val[rt];
int k=c[rt][];
while(r) k=r;
return val[k];
}
int succ(int v){
Rank(v);
if(val[rt]>=v) return val[rt];
int k=c[rt][];
while(l) k=l;
return val[k];
}
#undef l
#undef r
int main(){
freopen("turnover.in","r",stdin);
freopen("turnover.out","w",stdout);
insert(-inf);insert(inf);
n=read();int ans();
for(int i=,x,tp,ts;i<n;i++){
x=read();
if(rt==) ans+=x;
else{
tp=prev(x);
ts=succ(x);
if(ts==inf) ans+=(x-tp);
else if(tp==-inf) ans+=(ts-x);
else ans+=min((x-tp),(ts-x));
}
insert(x);
}
printf("%d",ans);
return ;
}

最新文章

  1. 写一个程序可以对两个字符串进行测试,得知第一个字符串是否包含在第二个字符串中。如字符串”PEN”包含在字符串“INDEPENDENT”中。
  2. Windows Azure IP地址详解
  3. 四个基数任意次数组合相加得到一个数N,求所有可能组合
  4. Android 自定义dialog(AlertDialog的修改样式)
  5. Unique Paths II 解答
  6. 了解HTML5和“她”的 API (一)
  7. hdu_1513_Palindrome(LCS+滚动数组)
  8. PHP扩展开发-1
  9. js获取节点和编辑的方法
  10. Node.js平台的一些使用总结
  11. 探索Visual Studio生成的.vs文件夹内部结构和作用
  12. 2-jsp简介
  13. 关于报错:There is already &#39;xxxController&#39; bean method的解决方法
  14. JavaWeb核心之Servlet
  15. # postgresql-shared_buffers
  16. L248 词汇题 2006
  17. 【Java集合源码剖析】HashMap源码剖析
  18. 线程同步 –AutoResetEvent和ManualResetEvent
  19. cf-789A (思维)
  20. 最小生成树 - 普里姆 - 边稠密 - O(N ^ 2)

热门文章

  1. Android touch事件处理流程
  2. nginx 的信号控制概述
  3. AngularJS 指令
  4. 挖一挖C#中那些我们不常用的东西之系列(3)——StackTrace,Trim
  5. mod_PHP&amp;fastcgi
  6. Java Hello World例子和添加按钮事件与功能
  7. css3 border-radius
  8. [转]TextArea设置MaxLength属性最大输入值的js代码
  9. 结对编程项目——四则运算vs版
  10. CF687A. NP-Hard Problem[二分图判定]