treap数组版

然而就是将指针的地方换成int引用

就是存个代码

#include<cstdio>
#include<iostream>
#include<cstdlib>
#include<ctime>
using namespace std;
struct node
{
    int val;
    int yuk;
    int siz;
    int key;
    int ch[2];
};
node t[501000];
int tail;
int cmp(int now,int val)
{
    if(t[now].val==val) return -1;
    return t[now].val > val ? 0 : 1 ;
}
void sum(int &now)
{
    t[now].siz=t[t[now].ch[0]].siz+t[t[now].ch[1]].siz+t[now].yuk;
    return ;
}
void rotato(int &now,int base)
{
    int k=t[now].ch[base^1];
    t[now].ch[base^1]=t[k].ch[base];
    t[k].ch[base]=now;
    sum(now);   sum(k);
    now=k;
}
int New(int val)
{
    ++tail;
    t[tail].ch[0]=t[tail].ch[1]=0;
    t[tail].siz=1;t[tail].yuk=1;
    t[tail].val=val;
    t[tail].key=rand();
    return tail;
}
void init()
{
    t[0].val=0;t[0].yuk=0;
    t[0].key=-1;
    t[0].ch[0]=t[0].ch[1]=0;
    srand(time(NULL));
    return ;
}
void insert(int &now,int val)
{
    if(now==0){now=New(val);return ;}
    int dir=cmp(now,val);
    if(dir==-1){t[now].yuk+=1;t[now].siz+=1;return ;}
    insert(t[now].ch[dir],val);
    if(t[t[now].ch[dir]].key>t[now].key)    rotato(now,dir^1);
    sum(now);
}
void del(int &now,int val)
{
    int dir=cmp(now,val);
    if(dir==-1)
        if(t[now].yuk>1){t[now].siz-=1,t[now].yuk-=1;return;}
        else
        {
            if(t[now].ch[1]&&t[now].ch[0])
            {
                int nxt= t[t[now].ch[0]].key > t[t[now].ch[1]].key ? 0 : 1;
                rotato(now,nxt^1);
                del(t[now].ch[nxt^1],val);
                sum(now);return ;
            }
            if(t[now].ch[1]){now=t[now].ch[1];sum(now);return ;}
            else {now=t[now].ch[0];sum(now);return ;}
        }
    del(t[now].ch[dir],val);sum(now);
    return;
}
int nxt(int now,int val)
{
    if(!now)    return 0x7fffffff;
    if(t[now].val>val)
        return min(t[now].val,nxt(t[now].ch[0],val));
    else
        return nxt(t[now].ch[1],val);
}
int pre(int now,int val)
{
    if(!now)    return -0x7fffffff;
    if(t[now].val<val)
        return max(t[now].val,pre(t[now].ch[1],val));
    else    
        return pre(t[now].ch[0],val);
}
int find(int &now,int val)
{
    int dir=cmp(now,val);
    if(dir==-1) return t[t[now].ch[0]].siz+1;
    return find(t[now].ch[dir],val) + ( dir ? t[t[now].ch[0]].siz + t[now].yuk : 0);
}
int kth(int &now,int k)
{
    if(t[t[now].ch[0]].siz<k&&t[t[now].ch[0]].siz+t[now].yuk>=k)
        return t[now].val;
    if(k<=t[t[now].ch[0]].siz)
        return kth(t[now].ch[0],k);
    else
        return kth(t[now].ch[1],k-t[t[now].ch[0]].siz-t[now].yuk);
}
int root;
void visit(int now)
{
    if(!now)
        return ;
    visit(t[now].ch[0]);
    printf("%d ",t[now].val);
    visit(t[now].ch[1]);
    return ;
}
int main()
{
    int n;
    scanf("%d",&n);
    int a,b;
    for(int i=1;i<=n;i++)
    {
        scanf("%d%d",&a,&b);
        switch(a)
        {
            case 1:insert(root,b);break;
            case 2:del(root,b);break;
            case 3:printf("%d\n",find(root,b));break;
            case 4:printf("%d\n",kth(root,b));break;
            case 5:insert(root,b);printf("%d\n",pre(root,b));del(root,b);break;
            case 6:insert(root,b);printf("%d\n",nxt(root,b));del(root,b);break;
        }
        //visit(root);printf("\n");
    }
}

转载于:https://www.cnblogs.com/Lance1ot/p/9164293.html

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值