• bzoj:3224: Tyvj 1728 普通平衡树


    Description

    您需要写一种数据结构(可参考题目标题),来维护一些数,其中需要提供以下操作:
    1. 插入x数
    2. 删除x数(若有多个相同的数,因只删除一个)
    3. 查询x数的排名(若有多个相同的数,因输出最小的排名)
    4. 查询排名为x的数
    5. 求x的前驱(前驱定义为小于x,且最大的数)
    6. 求x的后继(后继定义为大于x,且最小的数)

    Input

    第一行为n,表示操作的个数,下面n行每行有两个数opt和x,opt表示操作的序号(1<=opt<=6)

    Output

    对于操作3,4,5,6每行输出一个数,表示对应答案

    Sample Input

    10
    1 106465
    4 1
    1 317721
    1 460929
    1 644985
    1 84185
    1 89851
    6 81968
    1 492737
    5 493598

    Sample Output

    106465
    84185
    492737
     
    测试各类平衡树模板
     
    首先是treap
     
     
    #include<cstdio>
    #include<cstdlib>
    #include<algorithm>
    using namespace std;
    
    int n,o,p,ch,b,f;
    inline int read(){
        p=0;ch=getchar();f=1;
        while(ch<'0'||ch>'9'){if (ch=='-') f=-1;ch=getchar();}
        while(ch>='0'&&ch<='9') p=p*10+ch-48,ch=getchar();
        return p*f;
    }
    struct tree{
        int l,r,k,ra,w,s;
        tree(){
            l=r=0;
        }
    };
    struct treap{
        int size,root;
        tree t[100001];
        treap(){
            size=0;root=0;
        }
        inline void ler(int &p){
            int k=t[p].r;
            t[p].r=t[k].l;
            t[k].l=p;
            t[k].s=t[p].s;
            t[p].s=t[t[p].l].s+t[t[p].r].s+t[p].w;
            p=k;
        }
        inline void rir(int &p){
            int k=t[p].l;
            t[p].l=t[k].r;
            t[k].r=p;
            t[k].s=t[p].s;
            t[p].s=t[t[p].l].s+t[t[p].r].s+t[p].w;
            p=k;
        }
        inline void insert(int &p,int k){
            if (p==0){
                p=++size;
                t[p].k=k;
                t[p].w=1;
                t[p].s=1;
                t[p].ra=rand();
                return;
            }
            t[p].s++;
            if (t[p].k==k) t[p].w++;else
            if (t[p].k>k){
                insert(t[p].l,k);
                if (t[t[p].l].ra<t[p].ra) rir(p);
            }else{
                insert(t[p].r,k);
                if (t[t[p].r].ra<t[p].ra) ler(p);
            }
        }
        inline void dell(int &p){
            if (t[p].l==0&&t[p].r==0) p=0;else
            if (t[p].l==0) ler(p),dell(t[p].l);else
            if (t[p].r==0) rir(p),dell(t[p].r);else
            if (t[t[p].l].ra<t[t[p].r].ra) rir(p),dell(t[p].r);else ler(p),dell(t[p].l);
        }
        inline void del(int &p,int k){
            t[p].s--;
            if (t[p].k==k){
                t[p].w--;
                if (t[p].w) return;
                dell(p);
            }else
            if (t[p].k<k) del(t[p].r,k);else del(t[p].l,k);
        }
        inline int qua(int p,int k){
            if (p==0) return p=-1e9;
            if (t[p].k<=k) return qua(t[p].r,k);else{
                int u=qua(t[p].l,k);
                if (u==-1e9) return t[p].k;else return u;
            }
        }
        inline int qui(int p,int k){
            if (p==0) return -1e9;
            if (t[p].k>=k) return qui(t[p].l,k);else{
                int u=qui(t[p].r,k);
                if (u==-1e9) return t[p].k;else return u;
            }
        }
        inline int qup(int p,int k){
            if (!p) return 0;
            if (t[p].k>=k) return qup(t[p].l,k);else
            return qup(t[p].r,k)+t[t[p].l].s+t[p].w;
        }
        inline int qu(int p,int k){
            if (t[t[p].l].s<k&&t[t[p].l].s+t[p].w>=k) return t[p].k;else
            if (t[t[p].l].s>=k) return qu(t[p].l,k);else return qu(t[p].r,k-t[p].w-t[t[p].l].s);
        }
    };
    treap t;
    int main(){
        n=read();
        srand(n);
        while(n--){
            o=read();b=read();
            if (o==1) t.insert(t.root,b);else
            if (o==2) t.del(t.root,b);else
            if (o==3) printf("%d
    ",t.qup(t.root,b)+1);else
            if (o==4) printf("%d
    ",t.qu(t.root,b));else
            if (o==5) printf("%d
    ",t.qui(t.root,b));else
            printf("%d
    ",t.qua(t.root,b));
        }
    }

    然后是SBT

    #include<cstdio>
    #include<cstdlib>
    #include<algorithm>
    using namespace std;
    
    int n,o,p,ch,b,f;
    inline int read(){
        p=0;ch=getchar();f=1;
        while(ch<'0'||ch>'9'){if (ch=='-') f=-1;ch=getchar();}
        while(ch>='0'&&ch<='9') p=p*10+ch-48,ch=getchar();
        return p*f;
    }
    struct tree{
        int l,r,k,w,s;
        tree(){
            l=r=0;
        }
    };
    struct SBT{
        int size,root;
        tree t[100001];
        SBT(){
            size=0;root=0;
        }
        inline void ler(int &p){
            int k=t[p].r;
            t[p].r=t[k].l;
            t[k].l=p;
            t[k].s=t[p].s;
            t[p].s=t[t[p].l].s+t[t[p].r].s+t[p].w;
            p=k;
        }
        inline void rir(int &p){
            int k=t[p].l;
            t[p].l=t[k].r;
            t[k].r=p;
            t[k].s=t[p].s;
            t[p].s=t[t[p].l].s+t[t[p].r].s+t[p].w;
            p=k;
        }
        inline void ph(int &p,bool bo){
            if (!bo){
                if (t[t[p].r].s<t[t[t[p].l].l].s) rir(p);else
                if (t[t[p].r].s<t[t[t[p].l].r].s){
                    ler(t[p].l);
                    rir(p);
                }else return;
            }else{
                if (t[t[p].l].s<t[t[t[p].r].r].s) ler(p);else
                if (t[t[p].l].s<t[t[t[p].r].l].s){
                    rir(t[p].r);
                    ler(p);
                }else return;
            }
            ph(t[p].l,0);
            ph(t[p].r,1);
            ph(p,0);
            ph(p,1);
        }
        inline void insert(int &p,int k){
            if (p==0){
                p=++size;
                t[p].k=k;
                t[p].w=1;
                t[p].s=1;
                return;
            }
            t[p].s++;
            if (t[p].k==k) t[p].w++;else
            if (t[p].k>k){
                insert(t[p].l,k);
            }else{
                insert(t[p].r,k);
            }
            ph(p,t[p].k<=k);
        }
        inline void dell(int &p){
            if (t[p].l==0&&t[p].r==0) p=0;else
            if (t[p].l==0) ler(p),dell(t[p].l);else
            if (t[p].r==0) rir(p),dell(t[p].r);else
            rir(p),dell(t[p].r);
        }
        inline void del(int &p,int k){
            t[p].s--;
            if (t[p].k==k){
                t[p].w--;
                if (t[p].w) return;
                dell(p);
            }else
            if (t[p].k<k) del(t[p].r,k);else del(t[p].l,k);
        ph(p,0);
        ph(p,1);
        }
        inline int qua(int p,int k){
            if (p==0) return p=-1e9;
            if (t[p].k<=k) return qua(t[p].r,k);else{
                int u=qua(t[p].l,k);
                if (u==-1e9) return t[p].k;else return u;
            }
        }
        inline int qui(int p,int k){
            if (p==0) return -1e9;
            if (t[p].k>=k) return qui(t[p].l,k);else{
                int u=qui(t[p].r,k);
                if (u==-1e9) return t[p].k;else return u;
            }
        }
        inline int qup(int p,int k){
            if (!p) return 0;
            if (t[p].k>=k) return qup(t[p].l,k);else
            return qup(t[p].r,k)+t[t[p].l].s+t[p].w;
        }
        inline int qu(int p,int k){
            if (t[t[p].l].s<k&&t[t[p].l].s+t[p].w>=k) return t[p].k;else
            if (t[t[p].l].s>=k) return qu(t[p].l,k);else return qu(t[p].r,k-t[p].w-t[t[p].l].s);
        }
    };
    SBT t;
    int main(){
        n=read();
        while(n--){
            o=read();b=read();
            if (o==1) t.insert(t.root,b);else
            if (o==2) t.del(t.root,b);else
            if (o==3) printf("%d
    ",t.qup(t.root,b)+1);else
            if (o==4) printf("%d
    ",t.qu(t.root,b));else
            if (o==5) printf("%d
    ",t.qui(t.root,b));else
            printf("%d
    ",t.qua(t.root,b));
        }
    }

    最后是SPLAY

    #include<cstdio>
    #include<cstdlib>
    #include<algorithm>
    using namespace std;
    
    int n,o,p,ch,b,f;
    inline int read(){
        p=0;ch=getchar();f=1;
        while(ch<'0'||ch>'9'){if (ch=='-') f=-1;ch=getchar();}
        while(ch>='0'&&ch<='9') p=p*10+ch-48,ch=getchar();
        return p*f;
    }
    struct tree{
        int l,r,k,w,f,s;
        tree(){
            f=l=r=0;
        }
    };
    struct splay_tree{
        int size,root;
        tree t[100001];
        splay_tree(){
            size=0;root=0;
        }
        inline void ler(int &p){
            int k=t[p].r;
            t[k].f=t[p].f;
            t[p].f=k;
            t[t[k].l].f=p;
            t[p].r=t[k].l;
            t[k].l=p;
            t[k].s=t[p].s;
            t[p].s=t[t[p].l].s+t[t[p].r].s+t[p].w;
            p=k;
        }
        inline void rir(int &p){
            int k=t[p].l;
            t[k].f=t[p].f;
            t[p].f=k;
            t[t[k].r].f=p;
            t[p].l=t[k].r;
            t[k].r=p;
            t[k].s=t[p].s;
            t[p].s=t[t[p].l].s+t[t[p].r].s+t[p].w;
            p=k;
        }
        inline void ph(int &x,bool bo){
            if (bo) rir(x);else ler(x);
        }
        inline bool getc(int x){
            return t[t[x].f].l==x;
        }
        inline void rot(int l){
            if (getc(t[l].f)) ph(t[t[t[l].f].f].l,getc(l));else ph(t[t[t[l].f].f].r,getc(l));
        }
        inline void splay(int l){
            while (l!=root&&l){
                if (t[l].f==root) ph(root,getc(l));else{
                    int p=t[t[l].f].f;
                    if (getc(l)==getc(t[l].f)){
                        if (p==root) ph(root,getc(t[l].f)),ph(root,getc(l));else rot(t[l].f),rot(l);
                    }else{
                        if (p==root) rot(l),ph(root,getc(l));else rot(l),rot(l);
                    }
                }
            }
        }
        inline void insert(int &p,int k,int f){
            if (p==0){
                p=++size;
                t[p].k=k;
                t[p].w=1;
                t[p].f=f;
                t[p].s=1;
                splay(p);
                return;
            }
            t[p].s++;
            if (t[p].k==k) t[p].w++;else
            if (t[p].k>k) insert(t[p].l,k,p);else insert(t[p].r,k,p);
        }
        inline void dell(int &p){
            if (t[p].l==0&&t[p].r==0) p=0;else
            if (t[p].l==0) ler(p),dell(t[p].l);else
            rir(p),dell(t[p].r);
        }
        inline void del(int &p,int k){
            t[p].s--;
            if (t[p].k==k){
                t[p].w--;
                if (t[p].w){splay(p);return;}
                dell(p);
            }else
            if (t[p].k<k) del(t[p].r,k);else del(t[p].l,k);
        }
        inline int qua(int p,int k){
            if (p==0) return p=-1e9;
            if (t[p].k<=k) return qua(t[p].r,k);else{
                int u=qua(t[p].l,k);
                if (u==-1e9) return t[p].k;else return u;
            }
        }
        inline int qui(int p,int k){
            if (p==0) return -1e9;
            if (t[p].k>=k) return qui(t[p].l,k);else{
                int u=qui(t[p].r,k);
                if (u==-1e9){splay(p);return t[p].k;}else return u;
            }
        }
        inline int qup(int p,int k){
            if (p==0) return 0;
            if (t[p].k>=k) return qup(t[p].l,k);else
            return qup(t[p].r,k)+t[t[p].l].s+t[p].w;
        }
        inline int qu(int p,int k){
            if (t[t[p].l].s<k&&t[t[p].l].s+t[p].w>=k){splay(p);return t[p].k;}else
            if (t[t[p].l].s>=k) return qu(t[p].l,k);else return qu(t[p].r,k-t[p].w-t[t[p].l].s);
        }
    };
    splay_tree t;
    int main(){
        n=read();
        while(n--){
            o=read();b=read();
            if (o==1) t.insert(t.root,b,0);else
            if (o==2) t.del(t.root,b);else
            if (o==3) printf("%d
    ",t.qup(t.root,b)+1);else
            if (o==4) printf("%d
    ",t.qu(t.root,b));else
            if (o==5) printf("%d
    ",t.qui(t.root,b));else
            printf("%d
    ",t.qua(t.root,b));
        }
    }
  • 相关阅读:
    安装Python 3.6 在Ubuntu 16.04 LTS 版本
    [leetcode]447. Number of Boomerangs
    【leetcode】443. String Compression
    第7课 课堂学习小问答
    第11章 进程间通信(4)_进程信号量
    第11章 进程间通信(3)_共享内存
    第11章 进程间通信(2)_消息队列
    第11章 进程间通信(1)_管道
    第10章 线程控制(5)_多线程下的fork
    第10章 线程控制(4)_多线程下的信号
  • 原文地址:https://www.cnblogs.com/Enceladus/p/5211373.html
Copyright © 2020-2023  润新知