bzoj1588 [HNOI2002]营业额统计

来源:互联网 发布:多组数据相关性分析 编辑:程序博客网 时间:2024/05/20 22:30

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
该题数据bug已修复.—-2016.5.15

Source

题解
数据结构水题,用来练范浩强treap了(orz ycz大神)

代码

#include <cstdio>#include <cstdlib>#include <algorithm>#include <cstring>using namespace std;typedef pair<int,int> pii;const int sor=1234567890struct treap{     int tot,root,son[3000009][2],size[3000009],val[3000009];    int mem()    {        memset(val,255,sizeof(val));        return 0;    }    int updata(int a)    {        return size[a]=size[son[a][0]]+size[son[a][1]]+1;    }    int random(int limit)    {        return rand()%limit+1;    }    int merge(int a,int b)     {        if ((a==0)||(b==0))        {            return a+b;        }        if (random(size[a]+size[b])<=size[a])        {            son[a][1]=merge(son[a][1],b);            updata(a);            return a;        }        else        {            son[b][0]=merge(a,son[b][0]);            updata(b);            return b;        }    }    pii split(int a,int k)    {        if (size[a]==k)        {            return make_pair(a,0);        }        if (k==0)        {            return make_pair(0,a);        }        pii t;        if (size[son[a][0]]>=k)        {            t=split(son[a][0],k);            son[a][0]=t.second;            updata(a);            return make_pair(t.first,a);        }        else        {            t=split(son[a][1],k-size[son[a][0]]-1);            son[a][1]=t.first;            updata(a);            return make_pair(a,t.second);        }    }    int rank(int v)    {        int i=root,ans=0;        while (i!=0)        {            if (val[i]>=v)            {                i=son[i][0];            }            else            {                ans+=size[son[i][0]]+1;                i=son[i][1];            }        }        return ans+1;    }    int id(int v,int k)    {        if (k==0)        {            return 0;        }        if (size[son[v][0]]>=k)        {            return id(son[v][0],k);        }        if (size[son[v][0]]+1==k)        {            return v;        }        return id(son[v][1],k-size[son[v][0]]-1);    }    int getval(int v)    {        return val[id(root,v)];    }    int pre(int v)    {        return val[id(root,rank(v)-1)];    }    int next(int v)    {        return val[id(root,rank(v)+1)];    }    int insert(int v)    {        tot++;        son[tot][0]=son[tot][1]=0;        val[tot]=v;        size[tot]=1;        pii t=split(root,rank(v)-1);        root=merge(merge(t.first,tot),t.second);        return root;    }    int adelete(int v)    {        int x;        x=rank(v);        pii s,t;        s=split(root,x-1);        t=split(s.second,1);        root=merge(s.first,t.second);        return root;    }};treap tree;int n,x,pr,ne,ans;int main(){    tree.mem();    srand(sor);    scanf("%d",&n);    while (n--)    {        scanf("%d",&x);         tree.insert(x);        pr=tree.pre(x);        ne=tree.next(x);        if (pr==-1&&ne==-1)            {            ans+=x;            continue;        }        if (ne==-1)            {            ans+=abs(pr-x);            continue;        }        if (pr==-1)        {            ans+=abs(ne-x);            continue;        }        ans+=min(abs(ne-x),abs(pr-x));    }    printf("%d",ans);    return 0;} 
原创粉丝点击