Treap模板 BZOJ【3224】

biu!门

很高兴(能在有生之年)a掉treap

代码调试太稳了,改了一个地方就A了

没有什么调试的痕迹

上代码@!!

AC Code

#include<cstdio>
#include<iostream>
#define N 100005
using namespace std;
struct Treap
{
	int l,r,key,size,w,rnd;
}T[N*2];
int root,n,siz,opt,ans,x;
inline void update(int k)
{
	T[k].size=T[T[k].l].size+T[T[k].r].size+T[k].w;
}
inline void zig(int &k)
{
	int t=T[k].r;
	T[k].r=T[t].l;
	T[t].l=k;
	T[t].size=T[k].size;
	update(k);
	k=t;
}
inline void zag(int &k)
{
	int t=T[k].l;
	T[k].l=T[t].r;
	T[t].r=k;
	T[t].size=T[k].size;
	update(k);
	k=t;
}
inline int rand()
{
	int seed=7;
	return seed=(int)seed*1ll*48271%2147483647;
}
void insert(int &k,int x)
{
	if(!k)
	{
		siz++;
		k=siz;
		T[k].size=T[k].w=1;
		T[k].rnd=rand();
		T[k].key=x;
		return ;
	}
	T[k].size++;
	if(x==T[k].key)T[k].w++;
	else if(x>T[k].key)
	{
		insert(T[k].r,x);
		if(T[T[k].r].rnd<T[k].rnd)zig(k);
	}
	else 
	{
		insert(T[k].l,x);
		if(T[T[k].l].rnd<T[k].rnd)zag(k);
	}
}
void del(int &k,int x)
{
	if(!k) return ;
	if(x==T[k].key)
	{
		if(T[k].w>1)
		{
			T[k].w--;
			T[k].size--;
			return ;
		}
		if(T[k].l==0||T[k].r==0)k=T[k].l+T[k].r;
		else if(T[T[k].l].rnd<T[T[k].r].rnd)zag(k),del(k,x);
		else zig(k),del(k,x);
	}
	else if(x>T[k].key)T[k].size--,del(T[k].r,x);
	else T[k].size--,del(T[k].l,x);
	
}
int get_num(int k,int x)
{
	if(!k)return 0;
	if(x==T[k].key)
	{
		return T[T[k].l].size+1;
	}
	if(x<T[k].key)return get_num(T[k].l,x);
	return T[T[k].l].size+T[k].w+get_num(T[k].r,x);
}
void query_pro(int k,int x)
{
	if(!k)return ;
	if(x>T[k].key)
	{
		ans=T[k].key;
		query_pro(T[k].r,x);
	}
	else query_pro(T[k].l,x);
}
void query_sub(int k,int x)
{
	if(!k)return ;
	if(x<T[k].key)
	{
		ans=T[k].key;
		query_sub(T[k].l,x);
	}
	else query_sub(T[k].r,x);
}
int K_th(int k,int x)
{
	if(!k)return 0;
	if(x<=T[T[k].l].size)return K_th(T[k].l,x);
	if(x>T[k].w+T[T[k].l].size)return K_th(T[k].r,x-T[T[k].l].size-T[k].w);
	return T[k].key;
}
int main()
{
	scanf("%d",&n);
	for(int i=1;i<=n;i++)
	{
		scanf("%d%d",&opt,&x);
		switch(opt)
		{
			case 1:insert(root,x);break;
			case 2:del(root,x);break;
			case 3:printf("%d\n",get_num(root,x));break;
			case 4:printf("%d\n",K_th(root,x));break;
			case 5:query_pro(root,x);printf("%d\n",ans);break;
			case 6:query_sub(root,x);printf("%d\n",ans);break;
		}
	}
	return 0;
}

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值