luogu3369 普通平衡树(平衡树模板题)

题目链接:https://www.luogu.org/problemnew/show/P3369

#include<bits/stdc++.h>
using namespace std;

#define debug puts("YES");
#define rep(x,y,z) for(int (x)=(y);(x)<(z);(x)++)
#define ll long long

#define lrt int l,int r,int rt
#define lson l,mid,rt<<1
#define rson mid+1,r,rt<<1|1
#define root l,r,rt
#define mst(a,b) memset((a),(b),sizeof(a))
#define pii pair<int,int>
#define fi first
#define se second
#define mk(x,y) make_pair(x,y)
const int mod=1e9+7;
const int maxn=1e5+100;
const int ub=1e6;
ll powmod(ll x,ll y){ll t; for(t=1;y;y>>=1,x=x*x%mod) if(y&1) t=t*x%mod; return t;}
ll gcd(ll x,ll y){
    if(y==0) return x;
    return gcd(y,x%y);
}
int n,rt,tot=0;
struct Treap{
    int son[2],val,cnt,sz,data;
}node[maxn];
inline int Rand(){
    static ll r=2333;
    return (r*=233333LL)%=2147483647;
}
inline void pushup(int x){
    node[x].sz=node[node[x].son[0]].sz+node[node[x].son[1]].sz+node[x].cnt;
}
inline int build(int val){
    node[++tot].val=val;
    node[tot].cnt=node[tot].sz=1;
    node[tot].son[0]=node[tot].son[1]=0;
    node[tot].data=Rand();
    return tot;
}
inline void init(){
    rt=build(-2e9),node[rt].son[1]=build(2e9),pushup(rt);
}
inline void Rotate(int &x,int d){
    int k=node[x].son[d^1];
    node[x].son[d^1]=node[k].son[d];
    node[k].son[d]=x,x=k;
    pushup(node[x].son[d]),pushup(x);
}
inline void insert(int &x,int val){
    if(!x) {x=build(val);return;}
    ++node[x].sz;
    if(node[x].val==val) ++node[x].cnt;
    else if(node[x].val>val){
        insert(node[x].son[0],val);
        if(node[x].data<node[node[x].son[0]].data) 
            Rotate(x,1);
    }else{
        insert(node[x].son[1],val);
        if(node[x].data<node[node[x].son[1]].data)
            Rotate(x,0);
    }
    pushup(x);
}
inline void Delete(int &x,int val){
    if(!x) return ;
    if(node[x].val==val){
        if(node[x].cnt>1){
            --node[x].cnt;
            pushup(x);
            return ;
        }
        if(node[x].son[0]||node[x].son[1]){
            if(!node[x].son[1]||node[node[x].son[0]].data>node[node[x].son[1]].data)
                Rotate(x,1),Delete(node[x].son[1],val);
            else Rotate(x,0),Delete(node[x].son[0],val);
        }else x=0;
    }
    else if(node[x].val>val) Delete(node[x].son[0],val);
    else Delete(node[x].son[1],val);
    pushup(x);
}
inline int get_rank(int val){
    int x=rt,rk=0;
    while(x){
        if(node[x].val==val) return node[node[x].son[0]].sz+rk+1;
        else if(node[x].val>val) x=node[x].son[0];
        else{
            rk+=node[node[x].son[0]].sz+node[x].cnt,
            x=node[x].son[1];
        }
    }
    return 0;
}
inline int get_val(int rk){
    int x=rt;
    while(x){
        if(node[node[x].son[0]].sz>=rk) x=node[x].son[0];
        else if(node[node[x].son[0]].sz+node[x].cnt>=rk)
            return node[x].val;
        else{
            rk-=node[node[x].son[0]].sz+node[x].cnt;
            x=node[x].son[1];
        }
    }
    return 0;
}
inline int get_pre(int val){
    int x=rt,pre=0;
    while(x){
        if(node[x].val<val) pre=node[x].val,x=node[x].son[1];
        else x=node[x].son[0];
    }
    return pre;
}
inline int get_nxt(int val){
    int x=rt,nxt=0;
    while(x){
        if(node[x].val>val){
            nxt=node[x].val;
            x=node[x].son[0];
        }
        else x=node[x].son[1];
    }
    return nxt;
}
int main(){
    scanf("%d",&n);
    init();///
    for(int i=1;i<=n;i++){
        int op,x;
        scanf("%d%d",&op,&x);
        switch(op){
            case 1:insert(rt,x);break;
            case 2:Delete(rt,x);break;
            case 3:printf("%d\n",get_rank(x)-1);break;
            case 4:printf("%d\n",get_val(x+1));break;
            case 5:printf("%d\n",get_pre(x));break;
            case 6:printf("%d\n",get_nxt(x));break;
        }
    }
    return 0;
}

猜你喜欢

转载自blog.csdn.net/qq_37451344/article/details/89742528
今日推荐