Treap 模板

本文介绍了如何使用C++实现了一种高效的平衡二叉搜索树(如AVL树或红黑树),并展示了其在插入、查找和维护操作中的应用。通过split和merge函数,作者演示了如何进行树的分割和合并,以支持各种操作,如查找特定范围、添加和删除元素。适合对数据结构和算法感兴趣的开发者。
摘要由CSDN通过智能技术生成
#include<cstdio>
#include<cstring>
#include<cstdlib>
#define N 100010
using namespace std;
int len=0,root=1;
struct
{
	int v,s,l,r,si;
}a[N];
void update (int x)
{
	a[x].si=a[a[x].l].si+a[a[x].r].si+1;
}
void split(int rt,int &x,int &y,int key)
{
	if(!rt) x=y=0;
	else
	{
		if(a[rt].v<=key)	 
		{
			x=rt;
			split(a[rt].r,a[x].r,y,key);
		}
		else
		{
			y=rt;
			split(a[rt].l,x,a[y].l,key);
		}
		update(rt);
	}
}
void merge(int &rt,int x,int y)
{
	if(x==0) rt=y; 
	else if(y==0) rt=x;
	else
	{
		if(a[x].s<a[y].s)
		{
			rt=x;
			merge(a[rt].r,a[x].r,y);
		}
		else 
		{
			rt=y;
			merge(a[rt].l,x,a[y].l);
		}
		update(rt);
	}
}
int add(int v)
{
	a[len].l=a[++len].r=0;
	a[len].v=v;
	a[len].s=rand()*rand();
	a[len].si=1;
	return len;
}
int get(int rt,int v)
{
	while(a[a[rt].l].si+1!=v)
	{
		if(a[a[rt].l].si+1<v)
		{
			v-=a[a[rt].l].si+1;
			rt=a[rt].r;
		}
		else rt=a[rt].l;
	}
	return a[rt].v;
}
int main()
{
	int n,i,op,v;
	scanf("%d",&n);
	add(1e+9);
	a[1].si=0;
	for(i=1;i<=n;i++)
	{
		scanf("%d%d",&op,&v);
		if(op==1)
		{
			int x=0,y=0,k=add(v);
			split(root,x,y,v);
			merge(x,x,k);
			merge(root,x,y);
		}
		else if(op==2)
		{
			int x=0,y=0,z=0;
			split(root,x,y,v);
			split(x,x,z,v-1);
			merge(z,a[z].l,a[z].r);
			merge(x,x,z);
			merge(root,x,y);
		}
		else if(op==3)
		{
			int x=0,y=0;
			split(root,x,y,v-1);
			printf("%d\n",a[x].si+1);
			merge(root,x,y);
		}
		else if(op==4)
		{
			printf("%d\n",get(root,v));
		}
		else if(op==5)
		{
			int x=0,y=0;
			split(root,x,y,v-1);
			printf("%d\n",get(x,a[x].si));
			merge(root,x,y);
		}
		else 
		{
			int x=0,y=0;
			split(root,x,y,v);
			printf("%d\n",get(y,1));
			merge(root,x,y);
		}
	}
	return 0;
}
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值