• 模板——Fhq_treap


    $Fhq$ $treap$

    #include <bits/stdc++.h>
    using namespace std;
    const int MAXN=100100;
    int n,root,t;
    struct node
    {
        int val,key,si,son[2],g;
    }sh[MAXN];
    deque <int> q;
    int newnode(int v)
    {
        t++;
        sh[t].si=sh[t].g=1;
        sh[t].val=v;
        sh[t].key=rand();
        return t;
    }
    void pushup(int x)
    {
        sh[x].si=sh[x].g+sh[sh[x].son[0]].si+sh[sh[x].son[1]].si;
    }
    void split(int now,int k,int &x,int &y)
    {
        if (now==0)
        {
            x=y=0;
            return;
        }
        if (sh[now].val<=k)
        {
            x=now;
            split(sh[now].son[1],k,sh[now].son[1],y);
        }
        else
        {
            y=now;
            split(sh[now].son[0],k,x,sh[now].son[0]);
        }
        pushup(now);
    }
    int merge(int x,int y)
    {
        if (x==0)
          return y;
        if (y==0)
          return x;
        if (sh[x].key<sh[y].key)
        {
            sh[x].son[1]=merge(sh[x].son[1],y);
            pushup(x);
            return x;
        }
        else
        {
            sh[y].son[0]=merge(x,sh[y].son[0]);
            pushup(y);
            return y;
        }
    }
    int kth(int now,int k)
    {
        if (sh[sh[now].son[0]].si<k && k<=sh[sh[now].son[0]].si+sh[now].g)
          return now;
        else
        if (k<sh[sh[now].son[0]].si+sh[now].g)
          return kth(sh[now].son[0],k);
        else
          return kth(sh[now].son[1],k-sh[sh[now].son[0]].si-sh[now].g);
    }
    int find(int x)
    {
        q.clear();
        int cur;
        cur=root;
        while (sh[cur].son[x>sh[cur].val]!=0 && sh[cur].val!=x)
          q.push_back(cur),cur=sh[cur].son[x>sh[cur].val];
        q.push_back(cur);
        return cur;
    }
    void updata()
    {
        while (!q.empty())
        {
            pushup(q.back());
            q.pop_back();
        }
    }
    int main()
    {
        srand(time(0));
        root=0;
        scanf("%d",&n);
        for (int i=1;i<=n;i++)
        {
            int x,op;
            scanf("%d%d",&op,&x);
            if (op==1)
            {
                int cur=find(x);
                if (sh[cur].val==x)
                {
                    sh[cur].g++;
                    updata();
                }
                else
                {
                    int a,b;
                    split(root,x,a,b);
                    root=merge(merge(a,newnode(x)),b);
                }
            }
            if (op==2)
            {
                int cur=find(x);
                sh[cur].g--;
                updata();
                if (sh[cur].g==0)
                {
                    int a,b,c;
                    split(root,x,a,b);
                    split(a,x-1,a,c);
                    c=merge(sh[c].son[0],sh[c].son[1]);
                    root=merge(merge(a,b),c);
                }
            }
            if (op==3)
            {
                int a,b;
                split(root,x-1,a,b);
                printf("%d
    ",sh[a].si+1);
                root=merge(a,b);
            }
            if (op==4)
            {
                printf("%d
    ",sh[kth(root,x)].val);
            }
            if (op==5)
            {
                int a,b;
                split(root,x-1,a,b);
                printf("%d
    ",sh[kth(a,sh[a].si)].val);
                root=merge(a,b);
            }
            if (op==6)
            {
                int a,b;
                split(root,x,a,b);
                printf("%d
    ",sh[kth(b,1)].val);
                root=merge(a,b);
            }
        }
    }
  • 相关阅读:
    浅谈javascript中一些与DOM元素相关的属性名词
    一个弹出层插件
    模仿京东商城的一个图片轮播
    jQuery设计思想
    模仿自动完成效果
    linux下如何用GDB调试c++程序(转)
    Linux makefile 教程
    boost库解析
    记一次MongoDB性能问题,附原理解析
    深入分析Linux内核源码
  • 原文地址:https://www.cnblogs.com/huangchenyan/p/11216756.html
Copyright © 2020-2023  润新知