平衡树

Binary Index Tree

struct BinaryIndexTree
{
    const static int __=4e5+5;

    ll a[__];int c[__],idx,siz;

    BinaryIndexTree() {clear();}

    void push_back(ll x){a[++idx]=x;}

    int size() {return siz;}

    void build()
    {
        sort(a+1,a+1+idx);
        idx=unique(a+1,a+1+idx)-a-1;
    }

    int get(ll x)
    {
        return lower_bound(a+1,a+1+idx,x)-a;
    }

    void insert(ll x)
    {
        ++siz;
        for(int i=get(x);i<=idx;i+=i&-i)
            ++c[i];
    }

    void erase(ll x)
    {
        --siz;
        for(int i=get(x);i<=idx;i+=i&-i)
            --c[i];
    }

    int sum(int p)
    {
        int res=0;
        for(int i=p;i;i-=i&-i)
            res+=c[i];
        return res;
    }

    //x数的排名
    int rank(ll x)
    {
        int res=1;
        for(int i=get(x)-1;i;i-=i&-i)
            res+=c[i];
        return res;
    }

    //第x个数
    ll operator[](int x)
    {
        int p=idx;
        for(int l=1,r=idx;l<=r;)
        {
            int mid=(l+r)>>1,s=0;
            if(sum(mid)>=x)
                p=mid,r=mid-1;
            else l=mid+1;
        }
        return a[p];
    }

    //>x的最小数
    ll greater(ll x)
    {
        int p=idx,l=get(x);
        for(int y=sum(l++),r=idx;l<=r;)
        {
            int mid=(l+r)>>1;
            if(sum(mid)>y)
                p=mid,r=mid-1;
            else l=mid+1;
        }
        return a[p];
    }

    //>1;
            if(sum(mid-1)x的数的个数
    int upper(ll x){return siz-sum(get(x));}

    //

AVL

struct AVL
{
    #define fa(x) t[x].nex[0]
    #define ls(x) t[x].nex[1]
    #define rs(x) t[x].nex[2]

    const static int __=1e5+5;

    struct node
    {
        int val;
        int nex[3],cont,siz,h;

        void set(int pre,int v)
        {
            nex[0]=pre,val=v;
        }
        void clear()
        {
            cont=siz=h=1;
            mem(nex,0);
        }
    }t[__];

    int root;

    void pushup(int x)
    {
        t[x].siz=t[x].cont+t[ls(x)].siz+t[rs(x)].siz;
        t[x].h=max(t[ls(x)].h,t[rs(x)].h)+1;
    }

    struct memory
    {
        static const int __=1e5+5;
        int idx,trash[__];

        int get()
        {
            if(trash[0])return trash[trash[0]--];
            return ++idx;
        }

        void del(int x){trash[++trash[0]]=x;}

        void clear(){idx=trash[0]=0;}
    }M;

    AVL() {clear();}

    void rotate(int x)
    {
        int f=fa(x),k=(x==ls(f))?1:2;
        if(fa(f))
            t[fa(f)].nex[f==ls(fa(f))?1:2]=x;
        else root=x;
        t[f].nex[k]=t[x].nex[3-k];
        t[x].nex[3-k]=f;
        fa(x)=fa(f),fa(f)=x;
        if(t[f].nex[k])fa(t[f].nex[k])=f;
        pushup(f),pushup(x);
    }

    void up(int x)
    {
        for(;x;x=fa(x))
        {
            pushup(x);
            int dh=t[ls(x)].h-t[rs(x)].h;
            if(dh<=-2)
            {
                x=rs(x);
                if(t[ls(x)].h<=t[rs(x)].h)rotate(x);
                else x=ls(x),rotate(x),rotate(x);
            }
            if(dh>=2)
            {
                x=ls(x);
                if(t[ls(x)].h>=t[rs(x)].h)rotate(x);
                else x=rs(x),rotate(x),rotate(x);
            }
        }
    }

    void insert(int v)
    {
        int x=root,y=0;
        while(x && t[x].val!=v)
            if(v

Splay

struct Splay
{
    #define fa(x) t[x].nex[0]
    #define ls(x) t[x].nex[1]
    #define rs(x) t[x].nex[2]

    const static int __=1e5+5;

    struct node
    {
        int val;
        int nex[3],cont,siz;

        void set(int pre,int v)
        {
            nex[0]=pre,val=v;
        }
        void clear()
        {
            cont=siz=1;
            mem(nex,0);
        }
    }t[__];

    int root;

    void pushup(int x)
    {
        t[x].siz=t[x].cont+t[ls(x)].siz+t[rs(x)].siz;
    }

    struct memory
    {
        static const int __=1e5+5;
        int idx,trash[__];

        int get()
        {
            if(trash[0])return trash[trash[0]--];
            return ++idx;
        }

        void del(int x){trash[++trash[0]]=x;}

        void clear(){idx=trash[0]=0;}
    }M;

    Splay() {clear();}

    void rotate(int x)
    {
        int f=fa(x),k=(x==ls(f))?1:2;
        if(fa(f))
            t[fa(f)].nex[f==ls(fa(f))?1:2]=x;
        else root=x;
        t[f].nex[k]=t[x].nex[3-k];
        t[x].nex[3-k]=f;
        fa(x)=fa(f),fa(f)=x;
        if(t[f].nex[k])fa(t[f].nex[k])=f;
        pushup(f),pushup(x);
    }

    void splay(int x,int y=0)
    {
        while(fa(x)!=y)
        {
            int f=fa(x),ff=fa(f);
            if(ff==y)rotate(x);
            else
                if((x==ls(f))==(f==ls(ff)))
                    rotate(f),rotate(x);
                else rotate(x),rotate(x);
        }
    }

    void insert(int v)
    {
        int x=root,y=0;
        while(x && t[x].val!=v)
            if(v

Treap

struct Treap
{
    #define fa(x) t[x].nex[0]
    #define ls(x) t[x].nex[1]
    #define rs(x) t[x].nex[2]

    const static int __=1e5+5;

    struct node
    {
        int val,key;
        int nex[3],cont,siz;

        void set(int pre,int v)
        {
            nex[0]=pre,val=v;
        }
        void clear()
        {
            key=rand();
            cont=siz=1;
            mem(nex,0);
        }
    }t[__];

    int root;

    void pushup(int x)
    {
        t[x].siz=t[x].cont+t[ls(x)].siz+t[rs(x)].siz;
    }

    struct memory
    {
        static const int __=1e5+5;
        int idx,trash[__];

        int get()
        {
            if(trash[0])return trash[trash[0]--];
            return ++idx;
        }

        void del(int x){trash[++trash[0]]=x;}

        void clear(){idx=trash[0]=0;}
    }M;

    Treap() {srand(time(0));clear();}

    void rotate(int x)
    {
        int f=fa(x),k=(x==ls(f))?1:2;
        if(fa(f))
            t[fa(f)].nex[f==ls(fa(f))?1:2]=x;
        else root=x;
        t[f].nex[k]=t[x].nex[3-k];
        t[x].nex[3-k]=f;
        fa(x)=fa(f),fa(f)=x;
        if(t[f].nex[k])fa(t[f].nex[k])=f;
        pushup(f),pushup(x);
    }

    void up(int x)
    {
        for(;x;x=fa(x))
        {
            pushup(x);
            if(fa(x) && t[x].key

Scapegoat Tree

struct ScapegoatTree
{
    #define fa(x) t[x].nex[0]
    #define ls(x) t[x].nex[1]
    #define rs(x) t[x].nex[2]

    const static int __=1e5+5;
    constexpr static double alp=0.75;
    struct node
    {
        int val;
        int nex[3],cont,siz,num;

        void set(int pre,int v,int c)
        {
            nex[0]=pre,val=v,cont=c;
        }
        void clear()
        {
            cont=siz=num=1;
            mem(nex,0);
        }
    }t[__];

    int root,c[__],cont[__];

    void pushup(int x)
    {
        t[x].num=1+t[ls(x)].num+t[rs(x)].num;
        t[x].siz=t[x].cont+t[ls(x)].siz+t[rs(x)].siz;
    }

    struct memory
    {
        static const int __=1e5+5;
        int idx,trash[__];

        int get()
        {
            if(trash[0])return trash[trash[0]--];
            return ++idx;
        }

        void del(int x){trash[++trash[0]]=x;}

        void clear(){idx=trash[0]=0;}
    }M;

    ScapegoatTree() {clear();}

    void dfs(int x)
    {
        if(ls(x))dfs(ls(x));
        c[++c[0]]=t[x].val;
        cont[c[0]]=t[x].cont;
        M.del(x);
        if(rs(x))dfs(rs(x));
    }

    int build(int f,int l,int r)
    {
        if(l>r)return 0;
        int x=M.get(),m=(l+r)>>1;
        t[x].clear();
        t[x].set(f,c[m],cont[m]);
        ls(x)=build(x,l,m-1);
        rs(x)=build(x,m+1,r);
        pushup(x);
        return x;
    }

    void rebuild(int x)
    {
        //pf("rebuild %d\n",t[x].val);
        int f=fa(x);
        c[0]=0,dfs(x);
        int y=build(f,1,c[0]);
        if(!f)root=y;
        else t[f].nex[(x==ls(f))?1:2]=y;
    }

    bool check(int x)
    {
        double k=t[x].num*alp;
        if(t[ls(x)].num>k || t[rs(x)].num>k)
            return true;
        return false;
    }

    void up(int x)
    {
        int y=0;
        for(;x;x=fa(x))
        {
            pushup(x);
            if(check(x))y=x;
        }
        if(y)rebuild(y);
    }

    void insert(int v)
    {
        int x=root,y=0;
        while(x && t[x].val!=v)
            if(v

Treap(without rotate)

struct Treap
{
    #define fa(x) t[x].nex[0]
    #define ls(x) t[x].nex[1]
    #define rs(x) t[x].nex[2]

    const static int __=1e5+5;

    struct node
    {
        int val,key;
        int nex[3],cont,siz;

        void clear()
        {
            key=rand();
            cont=siz=1;
            mem(nex,0);
        }
    }t[__];

    int root;

    void pushup(int x)
   {
        t[x].siz=t[x].cont+t[ls(x)].siz+t[rs(x)].siz;
    }

    struct memory
    {
        static const int __=1e5+5;
        int idx,trash[__];

        int get()
        {
            if(trash[0])return trash[trash[0]--];
            return ++idx;
        }

        void del(int x){trash[++trash[0]]=x;}

        void clear(){idx=trash[0]=0;}
    }M;

    Treap() {srand(time(0));clear();}

    void up(int x)
    {
        for(;x;x=fa(x))pushup(x);
    }

    int find(int v)
    {
        int x=root;
        while(x && t[x].val!=v)
            if(v

你可能感兴趣的:(平衡树)