zoukankan      html  css  js  c++  java
  • 【BZOJ】3224: Tyvj 1728 普通平衡树

    【题意】

    1. 插入x数

    2. 删除x数(若有多个相同的数,因只删除一个)

    3. 查询x数的排名(若有多个相同的数,因输出最小的排名)

    4. 查询排名为x的数

    5. 求x的前驱(前驱定义为小于x,且最大的数)

    6. 求x的后继(后继定义为大于x,且最小的数)

    【算法】平衡树(treap)

    重要的细节以注释的形式标注在代码中。

    #include<cstdio>
    #include<cstring>
    #include<algorithm>
    using namespace std;
    const int maxn=100010;
    struct tree{int l,r,sz,rnd,num;}t[maxn*2];
    int n,sz,root;
    void up(int k){t[k].sz=1+t[t[k].l].sz+t[t[k].r].sz;}
    void lturn(int &k){
        int o=t[k].r;
        t[k].r=t[o].l;
        t[o].l=k;
        up(k);up(o);
        k=o;
    }
    void rturn(int &k){
        int o=t[k].l;
        t[k].l=t[o].r;
        t[o].r=k;
        up(k);up(o);
        k=o;
    }
    void ins(int &k,int x){
        if(!k){k=++sz;t[k].rnd=rand();t[k].num=x;t[k].sz=1;return;}//return
        t[k].sz++;
        if(x<=t[k].num){
            ins(t[k].l,x);
            if(t[t[k].l].rnd<t[k].rnd)rturn(k);//turn
        }
        else{
            ins(t[k].r,x);
            if(t[t[k].r].rnd<t[k].rnd)lturn(k);
        }
    }
    void del(int &k,int x){
        //t[k].sz--;
        if(t[k].num==x){
            if(t[k].l*t[k].r==0){k=t[k].l+t[k].r;return;}
            if(t[t[k].l].rnd<t[t[k].r].rnd){
                rturn(k);
                t[k].sz--;
                del(t[k].r,x);
            }
            else{
                lturn(k);
                t[k].sz--;
                del(t[k].l,x);
            }
        }
        else if(x<t[k].num)t[k].sz--,del(t[k].l,x);else t[k].sz--,del(t[k].r,x);
    }
    int find(int k,int x){
        if(!k)return 0;//!k
        if(x<=t[k].num)return find(t[k].l,x);
        else return t[t[k].l].sz+1+find(t[k].r,x);
    }
    int rank(int k,int x){
        if(t[t[k].l].sz+1==x)return t[k].num;
        if(x<t[t[k].l].sz+1)return rank(t[k].l,x);
        else return rank(t[k].r,x-t[t[k].l].sz-1);
    }
    int pre(int k,int x){
        if(!k)return -1;
        if(t[k].num<x)return max(t[k].num,pre(t[k].r,x));
        else return pre(t[k].l,x);
    }
    int suc(int k,int x){
        if(!k)return 0x3f3f3f3f;
        if(t[k].num>x)return min(t[k].num,suc(t[k].l,x));
        else return suc(t[k].r,x);
    }
    int main(){
        srand(233);//srand!!!!!!!!!!
        scanf("%d",&n);sz=root=0;
        for(int i=1;i<=n;i++){
            int opt,x;
            scanf("%d%d",&opt,&x);
            if(opt==1)ins(root,x);
            if(opt==2)del(root,x);
            if(opt==3)printf("%d
    ",find(root,x)+1);//+1
            if(opt==4)printf("%d
    ",rank(root,x));
            if(opt==5)printf("%d
    ",pre(root,x));
            if(opt==6)printf("%d
    ",suc(root,x));
        }
        return 0;
    }
    View Code
  • 相关阅读:
    leetcode Super Ugly Number
    leetcode Find Median from Data Stream
    leetcode Remove Invalid Parentheses
    leetcode Range Sum Query
    leetcode Range Sum Query
    leetcode Minimum Height Trees
    hdu 3836 Equivalent Sets
    hdu 1269 迷宫城堡
    hud 2586 How far away ?
    poj 1330 Nearest Common Ancestors
  • 原文地址:https://www.cnblogs.com/onioncyc/p/7890314.html
Copyright © 2011-2022 走看看