bzoj1588 营业额统计

来源:互联网 发布:淘宝属于阿里巴巴吗 编辑:程序博客网 时间:2024/05/29 08:18

Treap学的hzwer的模版,感觉还是比较轻松愉快的

/**************************************************************    Problem: 1588    User: Clare    Language: C++    Result: Accepted    Time:196 ms    Memory:2840 kb****************************************************************/ #include <cstdio>#include <iostream>#include <algorithm>#include <cstring>#include <cmath>#include <queue>#include <vector>using namespace std; #define N 100010#define INF 1000000000 int n,tot,root,ans1,ans2;long long Ans;int l[N],r[N],rd[N],v[N]; inline int read(){    int x=0,f=1;char ch=getchar();    while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}    while(ch<='9'&&ch>='0'){x=x*10+ch-'0';ch=getchar();}    return x*f;} void R_rotate(int &k){    int tmp=l[k];    l[k]=r[tmp];r[tmp]=k;k=tmp;} void L_rotate(int &k){    int tmp=r[k];    r[k]=l[tmp];l[tmp]=k;k=tmp;} void Insert(int &k,int x){    if(k==0)    {        k=++tot;v[k]=x;rd[k]=rand();        return;    }    if(v[k]>x)    {        Insert(l[k],x);        if(rd[l[k]]<rd[k])R_rotate(k);    }    else    {        Insert(r[k],x);        if(rd[r[k]]<rd[k])L_rotate(k);    }} void Get_before(int k,int x){    if(k==0)        return;    if(v[k]<=x)    {        ans1=v[k];Get_before(r[k],x);    }    else Get_before(l[k],x);} void Get_after(int k,int x){    if(k==0)        return;    if(v[k]>=x)    {        ans2=v[k];Get_after(l[k],x);    }    else Get_after(r[k],x);} int main(){    n=read();    for(int i=1;i<=n;i++)    {        int x;        if(scanf("%d",&x)==EOF)            x=0;        if(i==1)        {            Ans+=abs(x);Insert(root,x);            continue;        }        ans1=-INF;ans2=INF;        Get_after(root,x);Get_before(root,x);        Ans+=min(x-ans1,ans2-x);        Insert(root,x);    }    cout<<Ans<<endl;    return 0;}


0 0
原创粉丝点击