bzoj 3224 treap模板

本文介绍了一种基于平衡树的数据结构实现,包括插入、删除、查找等关键操作,并提供了完整的C++代码示例。该平衡树能够高效地进行元素的插入、删除及查找等操作。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

虽然看起来很多,但是我觉得已经是能简化到最简便的写法了,主要原因是我没有缩行,因为那样不好调试......

#include<iostream>
#include<cstdio>
#include<string>
using namespace std;
int seed = 2333;
int tot=1,root;
int ans;
int rankk()
{
    seed=(seed*seed + seed) % (10003);
	return seed;
}
struct node
{
	int son[2], value, rank, size, weight;//下次设计的时候把size设计成左右儿子的和;
};
node tree[200000];
int getsize(int num)
{
	return tree[tree[num].son[0]].size + tree[tree[num].son[0]].weight + tree[tree[num].son[1]].size + tree[tree[num].son[1]].weight;
}
int getallsize(int num)
{
	return tree[num].size + tree[num].weight;
}
void rotate(int &num, int kind)
{
	int temp = tree[num].son[kind];
	tree[num].son[kind] = tree[temp].son[kind ^ 1];
	tree[temp].son[kind ^ 1] = num;
	tree[num].size = getsize(num);
	tree[temp].size = getsize(temp);
	num = temp;
}
void insert(int &num, int value)
{
	if (num == 0)
	{
		num = tot++;
		tree[num].value = value;
		tree[num].rank = rankk();
		tree[num].weight = 1;
		return;
	}
	if (value == tree[num].value)
	{
		tree[num].weight++;
		return;
	}
	bool f = value > tree[num].value;
	tree[num].size++;
	insert(tree[num].son[f], value);
	if (tree[tree[num].son[f]].rank < tree[num].rank)
		rotate(num, f);
}
void deletee(int &num, int value)
{
	if (num == 0)
		return;
	if (tree[num].value == value)
	{
		if (tree[num].weight > 1)
			tree[num].weight--;
		else
		{
			if (tree[num].son[0] * tree[num].son[1] == 0)
				num = tree[num].son[0]+tree[num].son[1];
			else
			{
				rotate(num, tree[tree[num].son[1]].rank < tree[tree[num].son[0]].rank);
				deletee(num, value);
			}
		}
	}
	else
	{
		tree[num].size--;
		deletee(tree[num].son[value>tree[num].value], value);
	}
}
int getrank(int num, int value)
{
	if (num == 0)return 0 ;
	if (tree[num].value > value)
		return getrank(tree[num].son[0], value);
	if (tree[num].value == value)
		return  tree[tree[num].son[0]].size + tree[tree[num].son[0]].weight + 1;
	if (tree[num].value<value)
		return tree[num].weight + tree[tree[num].son[0]].size + tree[tree[num].son[0]].weight+getrank(tree[num].son[1], value);
}
int getvalue(int num, int rank)
{
	if (num == 0)return 0;
	if (rank <=getallsize(tree[num].son[0]))
		return getvalue(tree[num].son[0], rank);
	if (rank > getallsize(tree[num].son[0]) && rank <= getallsize(tree[num].son[0]) + tree[num].weight)
	return tree[num].value;
	else
	{
		rank -= getallsize(tree[num].son[0]) + tree[num].weight;
		return getvalue(tree[num].son[1], rank);
	}
}
void pre(int num, int value)
{
	if (num == 0)return;
	if (tree[num].value < value)
	{
		ans = tree[num].value;
		pre(tree[num].son[1], value);
	}
	else
		pre(tree[num].son[0], value);
}
void nextt(int num, int value)
{
	if (num == 0)return;
	if (tree[num].value > value)
	{
		ans = tree[num].value;
		nextt(tree[num].son[0], value);
	}
	else
		nextt(tree[num].son[1], value);
}
int main()
{
	int n;
	scanf("%d", &n);
	while (n--)
	{
		int a, b;
		scanf("%d%d", &a, &b);
		if (a == 1)
			insert(root, b);
		if (a == 2)
			deletee(root, b);
		if (a == 3)
			printf("%d\n", getrank(root, b));
		if (a == 4)
			printf("%d\n", getvalue(root, b));
		if (a == 5)
		{
			pre(root, b);
			printf("%d\n", ans);
		}
		if (a == 6)
		{
			nextt(root, b);
			printf("%d\n", ans);
                }
	}
	return 0;
}



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值