社区讨论

0分求调,Treap树

P5076【深基16.例7】普通二叉树(简化版)参与者 1已保存回复 1

讨论操作

快速查看讨论及其快照的属性,并进行相关操作。

当前回复
1 条
当前快照
1 份
快照标识符
@mhjaxz5j
此快照首次捕获于
2025/11/03 23:35
4 个月前
此快照最后确认于
2025/11/03 23:35
4 个月前
查看原帖
CPP
#include<bits/stdc++.h>
using namespace std;
struct Treap{
	int l,r;
	int val;
	int size;
	int dat;
}s[100000];

int tot,root;

int New(int value)
{
	s[++tot].val=value;
	s[tot].size=1;
	s[tot].dat=rand();
	return tot;
}

void Printf(int p)
{
	cout<<"************\n";
	cout<<"P: "<<p<<endl;
	cout<<"L: "<<s[p].l<<" R: "<<s[p].r<<endl;
	cout<<"Val: "<<s[p].val<<endl;
	cout<<"Size: "<<s[p].size<<endl;
	cout<<"*************\n";
}

void Build()
{
	New(-2147483647);
	New(2147483647);
	root=1,s[1].r=2;
	s[1].size=2;
}

void Update(int p)
{
	s[p].size=s[s[p].l].size+s[s[p].r].size+1;
	return;
}
void zig(int &p)
{
	int q=s[p].l;
	s[p].l=s[p].r;
	s[q].r=p;
	p=q;
	Update(s[p].r);
	Update(p);
	return;
}

void zag(int &p)
{
	int q=s[p].r;
	s[p].r=s[q].l;
	s[q].l=p;
	p=q;
	Update(s[p].l);
	Update(p);
	return;
}
void Insert(int &p,int val)
{
	if(p==0)
	{
		p=New(val);
		return;
	}
	else if(val<s[p].val)
	{
		Insert(s[p].l,val);
		if(s[p].dat<s[s[p].l].dat)zig(p);
	}
	else 
	{
		Insert(s[p].r,val);
		if(s[p].dat<s[s[p].r].dat)zag(p);
	}
	Update(p);
}

int GetRank(int p,int val)
{

	if(p==0)return 0;
	if(val>s[p].val)
	{
		return s[s[p].l].size+GetRank(s[p].r,val)+1;
	}
	else if(val==s[p].val)
	{
		return s[s[p].l].size+1;
	}
	else if(val<s[p].val)
	{
		return GetRank(s[p].l,val);
	}
}

int GetVal(int p,int rank)
{
	if(p==0)return -1;
	if(s[s[p].l].size>=rank)return GetVal(s[p].l,rank);
	else if(s[s[p].l].size+1>=rank)return s[p].val;
	else return GetVal(s[p].r,rank-s[s[p].l].size-1);
}

int GetPre(int val)
{
	int ans=1;
	int p=root;
	while(p)
	{
		if(val==s[p].val)
		{	
			if(s[p].l)
			{
				p=s[p].l;
				while(s[p].r)p=s[p].r;
				ans=p;
			}
			break;
		}
		if(s[p].val<val&&s[p].val>s[ans].val)ans=p;
		p= val<s[p].val?s[p].l:s[p].r;
	}
	return s[ans].val;
}

int GetNext(int val)
{
	int ans=2;
	int p=root;
	while(p)
	{
		if(val==s[p].val)
		{	
			if(s[p].r)
			{
				p=s[p].r;
				while(s[p].l)p=s[p].l;
				ans=p;
			}
			break;
		}
		if(s[p].val>val&&s[p].val<s[ans].val)ans=p;
		p= val<s[p].val?s[p].l:s[p].r;
	}
	return s[ans].val;
}

int n;

int main()
{
	Build();
	cin>>n;
	int opt,x;
	for(int i=1;i<=n;++i)
	{
		cin>>opt>>x;
		switch(opt)
		{
			case 1:
				cout<<GetRank(root,x)-1<<endl;
				break;
			case 2:
				cout<<GetVal(root,x+1)<<endl;
				break;
			case 3:
				cout<<GetPre(x)<<endl;
				break;
			case 4:
				cout<<GetNext(x)<<endl;
			case 5:
				Insert(root,x);
				break;	
		}		
	}
	return 0;
}

回复

1 条回复,欢迎继续交流。

正在加载回复...