带旋treap模板

#include<iostream>
#include<algorithm>
#include<cmath>
#include<cstring>
#include<queue>
#include<stack>
#include<deque>
#include<map>
#include<bitset>
#include<set>
#include<cstdio>
#include<vector>
#define ll long long
#define PI 3.1415926
#define mem(a,b) memset(a,b,sizeof(a))
#define REPF( i , a , b ) for ( int i = a ; i <= b ; ++ i )
#define REP( i , n ) for ( int i = 0 ; i < n ; ++ i )
#define lowbit(a) ((a)&-(a))
const ll INF=0x3f3f3f3f;
const ll Max=100005;
using namespace std;
int t,n,m,p;
int Size,cnt[Max],key[Max],rd[Max],siz[Max];
int son[Max][2];//son[Max][0]表示左儿子,son[Max][1],表示右儿子
/*queue<ll> q;
stack<ll> s;
//升序队列
priority_queue <int,vector<int>,greater<int> > q;
//降序队列
priority_queue <int,vector<int>,less<int> >q;*/
void push_up(int x)
{
    siz[x]=siz[son[x][0]]+siz[son[x][1]]+cnt[x];
}
void rotate(int &x,int d)//0左旋,1右旋
{
    int p=son[x][!d];
    son[x][!d]=son[p][d];
    son[p][d]=x;
    push_up(x);
    push_up(p);
    x=p;
}
void insert(int &rt,int x)//插入
{
    if(!rt)
    {
        rt=++Size;
        siz[rt]=cnt[rt]=1;
        key[rt]=x;
        rd[rt]=rand();
        return ;
    }
    if(key[rt]==x)
    {
        cnt[rt]++;
        siz[rt]++;
        return ;
    }
    int d=x>key[rt];
    insert(son[rt][d],x);
    if(rd[rt]<rd[son[rt][d]])
        rotate(rt,!d);
    push_up(rt);
}
void delet(int &rt,int x)//删除
{
    if(!rt)
        return ;
    if(x!=key[rt])
        delet(son[rt][x>key[rt]],x);
    else
    {
        if(!son[rt][0]&&!son[rt][1])
        {
            cnt[rt]--;
            siz[rt]--;
            if(!cnt[rt])
                rt=0;
        }

    else if(son[rt][0]&&!son[rt][1])
        {
            rotate(rt,1);
            delet(son[rt][1],x);
        }

    else if(!son[rt][0]&&son[rt][1])
    {
        rotate(rt,0);
        delet(son[rt][0],x);
    }
    else
    {
        int d=rd[son[rt][0]]>rd[son[rt][1]];
        rotate(rt,d);
        delet(son[rt][d],x);
    }
    }push_up(rt);
}
int pre(int rt,int x)//找前驱
{
    if(!rt)
        return -INF;
    if(key[rt]>=x)
        return pre(son[rt][0],x);
    else return max(key[rt],pre(son[rt][1],x));
}
int suf ( int rt, int x ) {//找后驱
	if ( ! rt )
		return INF;
	if ( key[rt] <= x )
		return suf ( son[rt][1], x );
	else
		return min ( key[rt], suf ( son[rt][0], x ) );
}
int find ( int rt, int x ) {//找排名为x的数
	if ( ! rt )
		return 0;
	if ( siz[son[rt][0]] >= x )
		return find ( son[rt][0], x );
	else if ( siz[son[rt][0]] + cnt[rt] < x )
			return find ( son[rt][1], x - cnt[rt] - siz[son[rt][0]] );
		else
			return key[rt];
}
int search_rank ( int rt, int x ) {//找x的排名
	if ( ! rt )
		return 0;
	if ( key[rt] == x )
		return siz[son[rt][0]] + 1;
	if ( key[rt] < x )
		return siz[son[rt][0]] + cnt[rt] + search_rank ( son[rt][1], x );
	return search_rank ( son[rt][0], x );
}
int main()
{   
    return 0;
}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值