1. 程式人生 > 實用技巧 >Splay原始碼(營業額統計 2234)

Splay原始碼(營業額統計 2234)

       #pragma GCC optimize(2)
        #include<bits/stdc++.h>
        using namespace std;
        int n,L=1,R=0,ans,root=1,cnt=1,minn,maxx;
        struct tree{
            int son[2];int num;int fa;
        }N[1000005];
        void searchr(int k){
            if(N[k].son[L]==0&&k!=root) return;
            if(N[root].son[R]==0) return;
            if(k==root){
                minn=N[N[k].son[R]].num;
                searchr(N[k].son[R]);
            }
            if(k!=root){
                minn=N[N[k].son[L]].num;
                searchr(N[k].son[L]);
            }
        }
        void searchl(int k){
            if(N[k].son[R]==0&&k!=root) return;
            if(N[root].son[L]==0) return;
            if(k==root){
                maxx=N[N[k].son[L]].num;
                searchl(N[k].son[L]);
            }
            if(k!=root){
                maxx=N[N[k].son[R]].num;
                searchl(N[k].son[R]);
            }
        }
        void rotate(int k){
            if(N[N[k].fa].son[L]==k){
                int t=N[k].son[R];
                int fafa=N[N[k].fa].fa;
                int fa=N[k].fa;
                N[k].son[R]=fa;
                N[fa].fa=k;
                N[k].fa=fafa;
                if(fafa!=0){
                  int y=R;
                  if(fa==N[fafa].son[L]) y=L;
                  N[fafa].son[y]=k;
                }
                 N[fa].son[L]=t;
                if(t!=0)N[t].fa=fa;
            }
            else{
                int t=N[k].son[L];
                int fafa=N[N[k].fa].fa;
                int fa=N[k].fa;
                N[k].son[L]=fa;
                N[fa].fa=k;
                N[k].fa=fafa;
                if(fafa!=0){
                  int y=R;
                  if(fa==N[fafa].son[L]) y=L;
                  N[fafa].son[y]=k;
                }
                N[fa].son[R]=t;
                if(t!=0) N[t].fa=fa;
            }
        }
        void splay(int k){
            while(N[k].fa!=0){
                if(N[N[k].fa].fa==0){
                   rotate(k);
                   if(N[root].fa!=0) root=N[root].fa;
                }
                else{
                   int u1=L;
                   if(N[k].fa==N[N[N[k].fa].fa].son[R]) u1=R;
                   int u2=L;
                   if(k==N[N[k].fa].son[R]) u2=R;
                   if(u1==u2) rotate(N[k].fa);
                   else rotate(k);
                   if(N[root].fa!=0) root=N[root].fa;
                   rotate(k);
                   if(N[root].fa!=0) root=N[root].fa;
                }
            }
            minn=10000000;
            maxx=-10000000;
            searchl(root);
            searchr(root);
            int a1=abs(minn-N[k].num);
            int a2=abs(N[k].num-maxx);
            ans+=a1<=a2?a1:a2;
        }
        void build(int k,int a){
            if(N[k].num<a){
                if(N[k].son[R]==0){
                   int y;++cnt;y=cnt;
                   N[k].son[R]=y;
                   N[y].num=a;
                   N[y].fa=k;
                   splay(y);return;
                }
                else build(N[k].son[R],a);
            }
            if(N[k].num>a){
                if(N[k].son[L]==0){
                   int y;++cnt;y=cnt;
                   N[k].son[L]=y;
                   N[y].num=a;
                   N[y].fa=k;
                   splay(y);return;
                }
                else build(N[k].son[L],a);
            }
        }
        int main()
        {
            N[0].num=100000000;
            scanf("%d",&n);
            int a;
            scanf("%d",&a);
            N[1].num=a;
            ans+=a;
            for(int i=2;i<=n;++i){
                scanf("%d",&a);
                build(root,a);
            }
            printf("%d",ans);
            return 0;
}