模板——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);
        }
    }
}
原文地址:https://www.cnblogs.com/huangchenyan/p/11216756.html