1 条题解

  • 0
    @ 2023-6-21 20:00:07

    C++ :

    #include<cstdio>
    #include<cstdlib>
    struct Node{
        Node *ch[2]; int v,u,s,r;
        Node(int x){ch[0]=ch[1]=NULL; v=x; u=rand(); s=r=1;}
        void update(){s=(ch[0]?ch[0]->s:0)+(ch[1]?ch[1]->s:0)+r;}
    }*rt;
    void rotate(Node *&p,int d){
        Node* q=p->ch[d]; p->ch[d]=q->ch[d^1]; q->ch[d^1]=p;
        p->update(); q->update(); p=q;
    }
    void insert(Node *&p,int v){
        if(!p) p=new Node(v); else if(p->v==v) ++p->r;
        else{
            int d=v>p->v; insert(p->ch[d],v);
            if(p->ch[d]->u<p->u) rotate(p,d);
        }
        p->update();
    }
    void erase(Node *&p,int v){
        if(p->v==v){
            --p->r; if(p->r>0){p->update(); return;}
            if(!p->ch[0]) p=p->ch[1];else if(!p->ch[1]) p=p->ch[0];
            else{
                int d=p->ch[0]->u>p->ch[1]->u; rotate(p,d); erase(p->ch[d^1],v);
            }
        }else erase(p->ch[v>p->v],v); if(p) p->update();
    }
    int kth(Node *p,int k){
        int ln=p->ch[0]?p->ch[0]->s:0; if(k>ln&&k<=ln+p->r) return p->v;
        if(k<=ln) return kth(p->ch[0],k); return kth(p->ch[1],k-ln-p->r);
    }
    int rank(Node *p,int v){
    	if(!p) return 0;
        int ln=p->ch[0]?p->ch[0]->s:0; if(v==p->v) return ln;
        if(v<p->v) return rank(p->ch[0],v); return ln+p->r+rank(p->ch[1],v);
    }
    int pre(Node *p,int v){
        if(!p) return 1e9;
        else if(p->v<v){
            int ans=pre(p->ch[1],v); if(ans==1e9) return p->v; return ans;
        }else return pre(p->ch[0],v);
    }
    int suc(Node *p,int v){
        if(!p) return 1e9;
        else if(p->v>v){
            int ans=suc(p->ch[0],v); if(ans==1e9) return p->v; return ans;
        }else return suc(p->ch[1],v);
    }
    int main(){
        int n; scanf("%d",&n);
        for(int i=1;i<=n;++i){
            int x,y; scanf("%d%d",&x,&y);
            if(x==0) insert(rt,y);else if(x==1) erase(rt,y);
            else if(x==3) printf("%d\n",rank(rt,y)); else if(x==2) printf("%d\n",kth(rt,y));
            else if(x==4){
            	int ans=pre(rt,y);
            	if(ans==1e9) printf("-1\n"); else printf("%d\n",ans);
    		}else if(x==5){
    			int ans=suc(rt,y);
    			if(ans==1e9) printf("-1\n"); else printf("%d\n",ans);
    		}
        }
        return 0;
    }
    
    • 1

    信息

    ID
    1014
    时间
    1000ms
    内存
    256MiB
    难度
    (无)
    标签
    递交数
    0
    已通过
    0
    上传者