Treap 求条
查看原帖
Treap 求条
322792
Alea楼主2023/9/1 16:30
#include <iostream>
using namespace std;
const int size=1e5+10;
int ch[size][2],val[size],rnd[size],siz[size],w[size],sz,rt,ans;
void pushup(int cur){
    siz[cur]=siz[ch[cur][0]]+siz[ch[cur][1]]+w[cur];
}
void rotate(int &cur,int d){
    int nef=ch[cur][d^1];
    ch[cur][d^1]=ch[nef][d];
    ch[nef][d]=cur;
    pushup(nef),pushup(cur);
    cur=nef;
}
void insert(int &cur,int x){
    if(cur==0){
        cur=++sz;
        siz[cur]=1,w[cur]=1,val[cur]=x,rnd[cur]=rand();
    }else{
        siz[cur]++;
        if(val[cur]==x) w[cur]++;
        else if(x<val[cur]){
            insert(ch[cur][0],x);
            if(rnd[ch[cur][0]]<rnd[cur]) rotate(cur,1);
        }else if(x>val[cur]){
            insert(ch[cur][1],x);
            if(rnd[ch[cur][1]]<rnd[cur]) rotate(cur,0); 
        }
    }
}
bool remove(int &cur,int x){
    if(cur==0) return false;
    if(val[cur]==x){
        if(w[cur]>1){
            w[cur]--,siz[cur]--;
            return true;
        }
        if(ch[cur][0]==0||ch[cur][1]==0){
            cur=ch[cur][0]+ch[cur][1];
            return true;
        }else if(rnd[ch[cur][0]]<rnd[ch[cur][1]]){
            rotate(cur,1);
            return remove(cur,x);
        }else{
            rotate(cur,0);
            return remove(cur,x);
        }
    }else if(val[cur]<x){
        bool succ=remove(ch[cur][1],x);
        if(succ) siz[cur]--;
        return succ;
    }else if(val[cur]>x){
        bool succ=remove(ch[cur][0],x);
        if(succ) siz[cur]--;
        return succ;
    }
}
int kth(int cur,int x){
    if(cur==0) return 0;
    if(val[cur]==x) return siz[ch[cur][0]]+1;
    else if(x>val[cur]) return siz[ch[cur][0]]+w[cur]+kth(ch[cur][1],x);
    else return kth(ch[cur][1],x);
}
int rnk(int cur,int x){
    if(cur==0) return 0;
    if(x<=siz[ch[cur][0]]) return rnk(ch[cur][0],x);
    else if(x>siz[ch[cur][0]]+w[cur]) return rnk(ch[cur][1],x-siz[ch[cur][0]]-w[cur]);
    else return val[cur];
}
void pre(int cur,int x){
    if(cur==0) return;
    if(val[cur]<x) ans=cur,pre(ch[cur][1],x);
    else pre(ch[cur][0],x);
}
void sub(int cur,int x){
    if(cur==0) return;
    if(val[cur]>x) ans=cur,sub(ch[cur][0],x);
    else sub(ch[cur][1],x);
}
int main(){
    int n,o,x;
    cin>>n;
    for(int i=1;i<=n;i++){
        cin>>o>>x;
        if(o==1) insert(rt,x);
        else if(o==2) remove(rt,x);
        else if(o==3) cout<<kth(rt,x)<<endl;
        else if(o==4) cout<<rnk(rt,x)<<endl;
        else if(o==5) pre(rt,x),cout<<val[ans]<<endl;
        else if(o==6) sub(rt,x),cout<<val[ans]<<endl;
    }
    return 0;
}
2023/9/1 16:30
加载中...