博客园 首页 私信博主 显示目录 隐藏目录 管理 动画

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\n",t.qup(t.root,b)+1);else
        if (o==4) printf("%d\n",t.qu(t.root,b));else
        if (o==5) printf("%d\n",t.qui(t.root,b));else
        printf("%d\n",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\n",t.qup(t.root,b)+1);else
        if (o==4) printf("%d\n",t.qu(t.root,b));else
        if (o==5) printf("%d\n",t.qui(t.root,b));else
        printf("%d\n",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\n",t.qup(t.root,b)+1);else
        if (o==4) printf("%d\n",t.qu(t.root,b));else
        if (o==5) printf("%d\n",t.qui(t.root,b));else
        printf("%d\n",t.qua(t.root,b));
    }
}

 

posted @ 2016-02-23 22:02  swm_sxt  阅读(227)  评论(0编辑  收藏  举报