zoukankan      html  css  js  c++  java
  • [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;
    }
  • 相关阅读:
    du熊学斐波那契I
    《博客园精华集》分类索引
    C++中指针和引用的区别
    堆和栈的区别
    getch和getchar的区别
    class和struct
    ARM开发步骤
    ARM寻址方式
    存储器映射
    思维中的错误
  • 原文地址:https://www.cnblogs.com/shandongs1/p/8149023.html
Copyright © 2011-2022 走看看