WA on #1 #2 蒟蒻求调
查看原帖
WA on #1 #2 蒟蒻求调
477222
Trae__Young楼主2024/7/22 11:46
    #include<bits/stdc++.h>
    using namespace std;
    int cnt,n,opt,x,inf=2147483647;
    struct node{
        int l,r,tot,size,key,val;
    }tr[400005];
    int nwnode(int val){
        cnt++;
        tr[cnt].val=val;
        tr[cnt].tot=tr[cnt].size=1;
        tr[cnt].key=rand();
        return cnt;

    }
    void push_up(int p){
        tr[p].size=tr[p].tot+tr[tr[p].l].size+tr[tr[p].r].size;
    }
    void youxuan(int &fa){
        int ls=tr[fa].l;
        tr[fa].l=tr[ls].r;
        tr[ls].r=fa;
        fa=ls;
        push_up(tr[fa].r);
        push_up(fa);
    }
    void zuoxuan(int &fa){
        int rs=tr[fa].r;
        tr[fa].r=tr[rs].l;
        tr[rs].l=fa;
        fa=rs;
        push_up(tr[fa].l);
        push_up(fa);
    }
    void insert(int &x,int val){
        if(!x){
            x=nwnode(val);
            return;
        }
        if(tr[x].val==val){
            tr[x].tot++;
            push_up(x);
            return;
        }
        if(val<tr[x].val){
            insert(tr[x].l,val);
            if(tr[tr[x].l].key>tr[x].key) youxuan(x);

        }else{
            insert(tr[x].r,val);
            if(tr[tr[x].r].key>tr[x].key) zuoxuan(x);
        }
        push_up(x);

    }
    void dlt(int &x,int val){
        if(!x) return;
        if(tr[x].val==val){
            if(tr[x].tot>1){
                --tr[x].tot;
                push_up(x);
                return;
            }else if(tr[x].l||tr[x].r){
                if(tr[x].l||tr[tr[x].l].key>tr[x].key){
                    youxuan(x);
                    dlt(tr[x].r,val);
                }else{
                    zuoxuan(x);
                    dlt(tr[x].l,val);
                }
                push_up(x);
            }

            else x=0;
            return;	

        }
        dlt(val<tr[x].val?tr[x].l:tr[x].r,val);
        push_up(x);
    }
    int getrank(int x,int val){
        if(!x) return 0;
        if(tr[x].val==val) return tr[tr[x].l].size+1;
        else if(val<tr[x].val){
            return getrank(tr[x].l,val);
        }else{
            return tr[tr[x].l].size+tr[x].tot+getrank(tr[x].r,val);
        }

    }
    int getval(int x,int k){
        if(!x) return 0;
        if(tr[tr[x].l].size>=k) return getval(tr[x].l,k);
        else if(tr[tr[x].l].size+tr[x].tot>=k) return tr[x].val;
        else return getval(tr[x].r,k-tr[x].tot-tr[tr[x].l].size);
    }
    int getpre(int x,int val){
        if(!x) return -inf;
        if(val<=tr[x].val) return getpre(tr[x].l,val);
        else return max(tr[x].val,getpre(tr[x].r,val));
    }
    int getsuf(int x,int val){
        if(!x) return inf;
        if(val>=tr[x].val){
            return getsuf(tr[x].r,val);		
        }
        return min(tr[x].val,getsuf(tr[x].l,val));
    }
    int main(){
        cin>>n;
        int root=1;
        nwnode(inf);
        for(int i=1;i<=n;i++){
            cin>>opt>>x;
            if(opt==1) insert(root,x);
            else if(opt==2) dlt(root,x);
            else if(opt==3) cout<<getrank(root,x)-1<<'\n';
            else if(opt==4) cout<<getval(root,x+1)<<'\n';
            else if(opt==5) cout<<getpre(root,x)<<'\n';
            else cout<<getsuf(root,x)<<'\n';
        }
        return 0;
    }

2024/7/22 11:46
加载中...