Codevs_P1296 [HNOI2002]营业额统计

来源:互联网 发布:淘宝手机p图教程视频 编辑:程序博客网 时间:2024/06/03 18:09

传送门
时间限制: 1 s
空间限制: 128000 KB
题目等级 : 大师 Master
题解
题目描述 Description
Tiger最近被公司升任为营业部经理,他上任后接受公司交给的第一项任务便是统计并分析公司成立以来的营业情况。

Tiger拿出了公司的账本,账本上记录了公司成立以来每天的营业额。分析营业情况是一项相当复杂的工作。由于节假日,大减价或者是其他情况的时候,营业额会出现一定的波动,当然一定的波动是能够接受的,但是在某些时候营业额突变得很高或是很低,这就证明公司此时的经营状况出现了问题。经济管理学上定义了一种最小波动值来衡量这种情况:

该天的最小波动值 = min{|该天以前某一天的营业额-该天营业额|}

当最小波动值越大时,就说明营业情况越不稳定。

而分析整个公司的从成立到现在营业情况是否稳定,只需要把每一天的最小波动值加起来就可以了。你的任务就是编写一个程序帮助Tiger来计算这一个值。

第一天的最小波动值为第一天的营业额。

输入描述 Input Description
第一行为正整数n(n<=32767),表示该公司从成立一直到现在的天数,接下来的n行每行有一个正整数ai(ai<=1000000),表示第i天公司的营业额。

输出描述 Output Description
输出文件仅有一个正整数,即每天最小波动值之和,小于231

样例输入 Sample Input
6
5
1
2
5
4
6

样例输出 Sample Output
12

数据范围及提示 Data Size & Hint
结果说明:5+|1-5|+|2-1|+|5-5|+|4-5|+|6-5|=5+4+1+0+1+1=12

#include<cstdio>#include<climits>#include<cstdlib>#include<iostream>using namespace std;#define INF INT_MAX/3*2struct SplayTree{    struct Node{        Node *ch[2];        int r,v,s,size;        Node(int v,Node* nl):v(v){size=s=1;r=rand();ch[0]=ch[1]=nl;}        void maintain(){size=ch[0]->size+s+ch[1]->size;}    }*root,*null;    SplayTree(){        null=new Node(0,0);null->r=INT_MAX;null->size=null->s=0;        null->ch[0]=null->ch[1]=null;root=null;    }    void rotate(Node* &o,int d){        Node *k=o->ch[d];o->ch[d]=k->ch[d^1];k->ch[d^1]=o;        o->maintain();k->maintain();o=k;    }       void insert(Node* &o,int x){        if(o==null){o=new Node(x,null);return;}        if(o->v==x){o->s++,o->size++;return;}        insert(o->ch[x>o->v],x);        if(o->ch[x>o->v]->r<o->r) rotate(o,x>o->v);        else o->maintain();    }    void remove(Node* &o,int x){        if(o->v==x){            if(o->s>1){o->s--;o->size--;return;}            int d=o->ch[0]->r>o->ch[1]->r;            if(o->ch[d]==null){delete o;o=null;return;}            rotate(o,d);remove(o->ch[d^1],x);        }        else remove(o->ch[x>o->v],x);        o->maintain();    }    int kth(Node *o,int x){        int d=o->ch[0]->size;        if(x<=d) return kth(o->ch[0],x);        else if(x>d+o->s) return kth(o->ch[1],x-d-o->s);        return o->v;    }    int rank(Node *o,int x){        int d=o->ch[0]->size;        if(x<o->v) return rank(o->ch[0],x);        else if(x>o->v) return rank(o->ch[1],x)+d+o->s;        return d;    }    int prev(Node *o,int x){        if(o==null) return -INF;        if(x==o->v&&o->s>1) return o->v;        else if(x<=o->v) return prev(o->ch[0],x);        return max(o->v,prev(o->ch[1],x));    }    int next(Node* o,int x){        if(o==null) return INF;        if(x==o->v&&o->s>1) return o->v;        else if(x>=o->v) return next(o->ch[1],x);        return min(o->v,next(o->ch[0],x));    }}T;int abs(int x){return x<0?-x:x;}int main(){    srand('B'+'e'+'i'+'Y'+'u');    int n,ans,x,prev,next;    scanf("%d",&n);    for(int i=1;i<=n;i++){        scanf("%d",&x);T.insert(T.root,x);        if(i==1) {ans=x;continue;}        prev=x-T.prev(T.root,x);next=T.next(T.root,x)-x;        ans+=min(prev,next);    }    printf("%d\n",ans);    return 0;}
1 0
原创粉丝点击