[HNOI2004]宠物收养场

https://www.luogu.org/problemnew/show/2286

splay 裸题

#include<cstdio>
const int mod=1e6;
const int maxn=1e5;
int n,who,com,now,ans;
int t[maxn],f[maxn],s[maxn][2];
int in,ax,rt,sz;
inline int min_(int x,int y){return x<y?x:y;}
void rot(int x){
    int y=f[x],z=f[y],l,r;
    l=s[y][0]==x?0:1;
    r=l^1;
    if(y==rt) rt=x;
    else{
        if(s[z][0]==y) s[z][0]=x;
        else s[z][1]=x;
    }
    f[x]=z,f[y]=x,f[s[x][r]]=y;
    s[y][l]=s[x][r],s[x][r]=y;
}
void splay(int x){
    int y,z;
    while(x!=rt){
        y=f[x],z=f[y];
        if(y!=rt){
            if(s[y][0]==x^s[z][0]==y) rot(x);
            else rot(y);
        }
        rot(x);
    }
}
void ins(int&k,int x,int fa){
    if(!k){
        ++sz,k=sz;
        t[k]=x,f[k]=fa;
        splay(k);
        return;
    }
    if(x<t[k]) ins(s[k][0],x,k);
    else ins(s[k][1],x,k);
}
void fin(int k,int x){
    if(!k) return;
    if(x>t[k]) in=k,fin(s[k][1],x);
    else fin(s[k][0],x);
}
void fax(int k,int x){
    if(!k) return;
    if(x<t[k]) ax=k,fax(s[k][0],x);
    else fax(s[k][1],x);
}
void del(int x){
    splay(x);
    if(s[x][0]&&s[x][1]){
        int k=s[x][1];rt=k;
        while(s[k][0]) k=s[k][0];
        s[k][0]=s[x][0],f[s[x][0]]=k;
    }
    else rt=s[x][0]+s[x][1];
    f[rt]=0;
}
int main(){
    scanf("%d",&n);
    for(int i=1;i<=n;i++){
        scanf("%d%d",&who,&com);
        if((who&&now<0)||(!who&&now>0)){
            in=maxn-1,ax=maxn-2,t[in]=-1e9,t[ax]=1e9;
            fin(rt,com),fax(rt,com);
            ans=(ans+min_(t[ax]-com,com-t[in]))%mod;
            if(com-t[in]<=t[ax]-com) del(in);
            else del(ax);
        }
        else ins(rt,com,0);
        now+=who?1:-1;
    }
    printf("%d
",ans);
    return 0;
}
原文地址:https://www.cnblogs.com/shandongs1/p/8149023.html