Description
营业额统计 Tiger最近被公司升任为营业部经理,他上任后接受公司交给的第一项任务便是统计并分析公司成立以来的营业情况。 Tiger拿出了公司的账本,账本上记录了公司成立以来每天的营业额。分析营业情况是一项相当复杂的工作。由于节假日,大减价或者是其他情况的时候,营业额会出现一定的波动,当然一定的波动是能够接受的,但是在某些时候营业额突变得很高或是很低,这就证明公司此时的经营状况出现了问题。经济管理学上定义了一种最小波动值来衡量这种情况: 该天的最小波动值 当最小波动值越大时,就说明营业情况越不稳定。 而分析整个公司的从成立到现在营业情况是否稳定,只需要把每一天的最小波动值加起来就可以了。你的任务就是编写一个程序帮助Tiger来计算这一个值。 第一天的最小波动值为第一天的营业额。 输入输出要求
Input
第一行为正整数 ,表示该公司从成立一直到现在的天数,接下来的n行每行有一个整数(有可能有负数) ,表示第i
天公司的营业额。
天数n<=32767,
每天的营业额ai <= 1,000,000。
最后结果T<=2^31
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
这题就是Treap的模板题,每次先求前驱再求后继然后两个数与输入的数之差最小的就是需要累计的答案。
代码:
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cstdlib>
#include<cmath>
#define maxn 60006
using namespace std;
struct node{
node* ch[2];
int key,f,s,num;
void maintain(){
s=num;
if(ch[0]!=NULL)s+=ch[0]->s;
if(ch[1]!=NULL)s+=ch[1]->s;
}
}treap[maxn];
typedef node* pnode;
node nul;
pnode len,root,null=&nul;
int n,ans;
void rot(pnode &p,int d){
pnode k=p->ch[d^1];p->ch[d^1]=k->ch[d];k->ch[d]=p;
p->maintain();k->maintain();p=k;
}
pnode newnode(int key){
len->key=key;len->s=1;len->num=1;len->f=rand();
len->ch[0]=len->ch[1]=null;
return len++;
}
void insert(pnode &p,int x){
if(p==null)p=newnode(x);else
if(p->key==x)p->num++,p->s++;else{
int d=p->key<x;
insert(p->ch[d],x);
if(p->ch[d]->f>p->f)rot(p,d^1);
}
p->maintain();
}
int pre(pnode p,int x){
if(p==null)return -1e9;
if(p->key>x)return pre(p->ch[0],x);
else return max(pre(p->ch[1],x),p->key);
}
int sub(pnode p,int x){
if(p==null)return 1e9;
if(p->key<x)return sub(p->ch[1],x);
else return min(sub(p->ch[0],x),p->key);
}
void print(pnode p){
if(p==null)return;
print(p->ch[0]);
for(int i=1;i<=p->num;i++) printf("%d ",p->key);
print(p->ch[1]);
}
int main(){
freopen("treap.in","r",stdin);
freopen("treap.out","w",stdout);
len=treap;null->ch[0]=null->ch[1]=null;null->s=0;root=null;
scanf("%d",&n);
for(int i=1;i<=n;i++){
int x;
scanf("%d",&x);
if(i!=1)ans+=min(abs(pre(root,x)-x),abs(sub(root,x)-x));
else ans+=x;
insert(root,x);
}
printf("%d",ans);
return 0;
}