codevs1285 宠物收养所 splayTree

来源:互联网 发布:国际数据公司idc官网 编辑:程序博客网 时间:2024/04/29 23:23

删除节点时把它移到根节点,把它的后继移到根的右子节点,然后删除根。

#include<iostream>#include<cstring>#include<cstdio>#include<algorithm>#include<cmath>#define inf 1000000000using namespace std;const int maxn=200005;struct SplayTree{    int son[maxn][2],pre[maxn],val[maxn];    int sum[maxn];    int rt,sz;    void pushUp(int x) {        sum[x]=sum[son[x][0]]+sum[son[x][1]]+1;    }    void newNode(int f,int& x,int a) {        x=++sz;        pre[x]=f;        val[x]=a;        sum[x]=1;        son[x][0]=son[x][1]=0;    }    void init() {        sz=rt=0;    }    void Rotate(int x,int c) {        int y=pre[x];        son[y][!c]=son[x][c];        pre[son[x][c]]=y;        pre[x]=pre[y];        if(pre[x])            son[pre[y]][son[pre[y]][1]==y]=x;        son[x][c]=y;        pre[y]=x;        pushUp(y);    }    void Splay(int x,int goal) {        while(pre[x]!=goal) {            if(pre[pre[x]]==goal) {                if(son[pre[x]][0]==x)                    Rotate(x,1);                else                    Rotate(x,0);            }            else {                int y=pre[x],z=pre[y];                if(son[z][0]==y) {                    if(son[y][0]==x) {                        Rotate(y,1);                        Rotate(x,1);                    }                    else {                        Rotate(x,0);                        Rotate(x,1);                    }                }                else {                    if(son[y][1]==x) {                        Rotate(y,0);                        Rotate(x,0);                    }                    else {                        Rotate(x,1);                        Rotate(x,0);                    }                }            }        }        pushUp(x);        if(goal==0)            rt=x;    }    void Insert(int a) {        if(rt==0) {            rt=++sz;            val[rt]=a;            sum[rt]=1;            son[rt][0]=son[rt][1]=0;            return;        }        int x=rt;        while(son[x][val[x]<a])            x=son[x][val[x]<a];        newNode(x,son[x][val[x]<a],a);        Splay(sz,0);    }    int getMin(int a) {        int Min=inf;        int x=rt;        while(x) {            if(val[x]==a)                return a;            if(val[x]>a)                Min=min(Min,val[x]);            if(val[x]>a)                x=son[x][0];            else                x=son[x][1];        }        return Min;    }    int getMax(int a) {        int Max=-inf;        int x=rt;        while(x) {            if(val[x]==a) {                return a;            }            if(val[x]<a) {                Max=max(Max,val[x]);            }            if(val[x]<a)                x=son[x][1];            else                x=son[x][0];        }        return Max;    }    int Find(int a) {        int x=rt;        while(x) {            if(val[x]==a)                return x;            if(val[x]>a)                x=son[x][0];            else                x=son[x][1];        }    }    void del(int a) {        int x=Find(a);        Splay(x,0);        int tmp=son[x][1];        if(tmp==0) {            rt=son[rt][0];            pre[rt]=0;            return;        }        while(son[tmp][0]) {            tmp=son[tmp][0];        }        Splay(tmp,x);        son[tmp][0]=son[rt][0];        pre[son[rt][0]]=tmp;        rt=tmp;        pre[rt]=0;    }}spt;int mod=1000000;int n,a,b;int main(){    spt.init();    scanf("%d",&n);    int c=0,p=0;    int ans=0;    while(n--) {        scanf("%d%d",&a,&b);        if(a==0) {            if(p==0) {                spt.Insert(b);                c++;            }            else {                int mi=spt.getMin(b);                int mx=spt.getMax(b);                if(abs(mx-b)<=abs(mi-b)) {                    spt.del(mx);                    ans=(ans+abs(mx-b))%mod;                }                else {                    spt.del(mi);                    ans=(ans+abs(mi-b))%mod;                }                p--;            }        }        else {            if(c==0) {                spt.Insert(b);                p++;            }            else {                int mi=spt.getMin(b);                int mx=spt.getMax(b);                if(abs(mx-b)<=abs(mi-b)) {                    spt.del(mx);                    ans=(ans+abs(mx-b))%mod;                }                else {                    spt.del(mi);                    ans=(ans+abs(mi-b))%mod;                }                c--;            }        }    }    printf("%d\n",ans);    return 0;}


0 0
原创粉丝点击