zoukankan      html  css  js  c++  java
  • [模板]普通平衡树

    原题链接:https://www.luogu.org/problemnew/show/3369

    一个平衡树的板子

    代码来自于黄学长,个人码风

    #include<cstdio>
    #include<cstdlib>
    #include<iostream>
    using namespace std;
    void read(int &y)
    {
        y=0;char x=getchar();
        while(x<'0'||x>'9') x=getchar();
        while(x>='0'&&x<='9')
        {
            y=y*10+x-'0';
            x=getchar();
        }
    }
    struct treap
    {
        int l,r,v,size,rnd,w;
    }tr[100005];
    int n,cnt,rot,op,m,ans;
    void update(int k)
    {
        tr[k].size=tr[tr[k].l].size+tr[tr[k].r].size+tr[k].w;
    }
    void rturn(int &k)
    {
        int t=tr[k].l;
        tr[k].l=tr[t].r;tr[t].r=k;
        tr[t].size=tr[k].size;
        update(k);k=t;
    }
    void lturn(int &k)
    {
        int t=tr[k].r;
        tr[k].r=tr[t].l;tr[t].l=k;
        tr[t].size=tr[k].size;
        update(k);k=t;
    }
    void insert(int &k,int x)
    {
        if(k==0)
        {
            cnt++;k=cnt;
            tr[k].size=tr[k].w=1;
            tr[k].v=x;tr[k].rnd=rand();
            return;
        }
        tr[k].size++;
        if(tr[k].v==x) tr[k].w++;
        else if(x>tr[k].v)
        {
            insert(tr[k].r,x);
            if(tr[tr[k].r].rnd<tr[k].rnd) lturn(k);
        }
        else
        {
            insert(tr[k].l,x);
            if(tr[tr[k].l].rnd<tr[k].rnd) rturn(k);
        }
    }
    void del(int &k,int x)
    {
        if(k==0) return;
        if(tr[k].v==x)
        {
            if(tr[k].w>1)
            {
                tr[k].w--;
                tr[k].size--;
                return;
            }
            if(tr[k].l*tr[k].r==0) k=tr[k].l+tr[k].r;
            else if(tr[tr[k].l].rnd<tr[tr[k].r].rnd)
            {
                rturn(k);
                del(k,x);
            }
            else
            {
                lturn(k);
                del(k,x);
            }
        }
        else if(x>tr[k].v)
        {
            tr[k].size--;
            del(tr[k].r,x);
        }
        else
        {
            tr[k].size--;
            del(tr[k].l,x);
        }
    }
    int rank(int k,int x)
    {
        if(k==0) return 0;
        if(tr[k].v==x) return tr[tr[k].l].size+1;
        else if(x>tr[k].v) return tr[tr[k].l].size+tr[k].w+rank(tr[k].r,x);
        else return rank(tr[k].l,x);
    }
    int num(int k,int x)
    {
        if(k==0) return 0;
        if(x<=tr[tr[k].l].size) return num(tr[k].l,x);
        else if(x>tr[tr[k].l].size+tr[k].w) return num(tr[k].r,x-tr[tr[k].l].size-tr[k].w);
        else return tr[k].v;
    }
    void pro(int k,int x)
    {
        if(k==0) return;
        if(tr[k].v<x)
        {
            ans=k;
            pro(tr[k].r,x);
        } 
        else pro(tr[k].l,x);
    }
    void sub(int k,int x)
    {
        if(k==0) return;
        if(tr[k].v>x)
        {
            ans=k;
            sub(tr[k].l,x);
        }
        else sub(tr[k].r,x);
    }
    int main()
    {
        read(n);
        while(n--)
        {
            scanf("%d %d",&op,&m);
            if(op==1) insert(rot,m);
            if(op==2) del(rot,m);
            if(op==3) printf("%d
    ",rank(rot,m));
            if(op==4) printf("%d
    ",num(rot,m));
            if(op==5)
            {
                ans=0;
                pro(rot,m);
                printf("%d
    ",tr[ans].v);
            }
            if(op==6)
            {
                ans=0;
                sub(rot,m);
                printf("%d
    ",tr[ans].v);
            }
        }
        return 0;
    }
  • 相关阅读:
    EV3-一种多米诺骨牌搭建机
    UART 通用异步传输器
    用Python进行EV3编程
    vectorized case sum
    Profile your program using GNU gprof
    Usage of the const keyword in C++
    Principles about returning a large data chunk from a function
    [cf1361E]James and the Chase
    [cf1444D]Rectangular Polyline
    [atAGC043B]123 Triangle
  • 原文地址:https://www.cnblogs.com/zeroform/p/8329578.html
Copyright © 2011-2022 走看看