21pts求调
查看原帖
21pts求调
895435
Zq_water楼主2023/9/19 18:06
#include <bits/stdc++.h>
using namespace std;
const int maxn = 1e5+5;
 
int n,rt,cnt;
struct Treap{
    int lch,rch,val,pri,cnt,siz;
}tr[maxn<<3];
 
int add(int x){
    tr[++cnt]={0,0,x,rand(),1,1};
    return cnt;
}
 
void push_up(int u){
    tr[u].siz=tr[tr[u].lch].siz+tr[tr[u].rch].siz+tr[u].cnt;
}
 
void zig(int &u){
    int v=tr[u].lch;
    tr[u].lch=tr[v].rch;
    tr[v].rch=u;
    tr[v].siz=tr[u].siz;
    push_up(u);
    u=v;
}
 
void zag(int &u){
    int v=tr[u].rch;
    tr[u].rch=tr[v].lch;
    tr[v].lch=u;
    tr[v].siz=tr[u].siz;
    push_up(u);
    u=v;
}
 
void insert(int &u,int k){
    if(!u){
        u=add(k);
        return;
    }
    tr[u].siz++;
    if(tr[u].val==k){
        tr[u].cnt++;
        return;
    }
    else{
        if(k<tr[u].val){
            insert(tr[u].lch,k);
            if(tr[u].pri<tr[tr[u].lch].pri) zig(u);
        }
        else{
            insert(tr[u].rch,k);
            if(tr[u].pri<tr[tr[u].rch].pri) zag(u);
        }
    }
    push_up(u);
}
 
void del(int &u,int k){
    if(!u) return;
    tr[u].siz--;
    if(k==tr[u].val){
        if(tr[u].cnt>1){
            tr[u].cnt--;
            return;
        }
        if(!tr[u].lch||!tr[u].rch) u=tr[u].lch+tr[u].rch;
        else if(tr[tr[u].lch].pri>tr[tr[u].rch].pri){
            zig(u);
            del(tr[u].rch,k);
        }
        else{
            zag(u);
            del(tr[u].lch,k);
        }
        return;
    }
    if(k<tr[u].val) del(tr[u].lch,k);
    else del(tr[u].rch,k);
    push_up(u); 
}
 
int pre(int u,int x){
    if(!u) return -2e9;
    if(x<=tr[u].val) return pre(tr[u].lch,x);
    else return max(tr[u].val,pre(tr[u].rch,x)); 
}
 
int nxt(int u,int x){
    if(!u) return 2e9;
    if(x>=tr[u].val) return nxt(tr[u].rch,x);
    else return min(tr[u].val,nxt(tr[u].lch,x));
}
 
int Val_to_Rank(int u,int k){
    if(!u) return 0;
    if(tr[u].val==k) return tr[tr[u].lch].siz+1; 
    if(k<tr[u].val) return Val_to_Rank(tr[u].lch,k);
    else return tr[tr[u].lch].siz+tr[u].cnt+Val_to_Rank(tr[u].rch,k);
}
 
int Rank_to_Val(int u,int k){
    if(!u) return 0;
    if(tr[tr[u].lch].siz>=k) return Rank_to_Val(tr[u].lch,k);
    if(tr[tr[u].lch].siz+tr[u].cnt>=k) return tr[u].val;
    return Rank_to_Val(tr[u].rch,k-tr[tr[u].lch].siz-tr[u].cnt);
}
 
int main(){
    scanf("%d",&n);
    for(int i=1,op,x;i<=n;i++){
        scanf("%d %d",&op,&x);
        if(op==1) insert(rt,x);
        else if(op==2) del(rt,x);
        else if(op==3) printf("%d\n",Val_to_Rank(rt,x));
        else if(op==4) printf("%d\n",Rank_to_Val(rt,x));
        else if(op==5) printf("%d\n",pre(rt,x));
        else if(op==6) printf("%d\n",nxt(rt,x));
    }
     
    return 0;
}//Zq_water
2023/9/19 18:06
加载中...