求调splay
查看原帖
求调splay
414210
Iam1789楼主2021/8/10 13:46

结果:评测结果

#include <bits/stdc++.h>
using namespace std;
int n;
int root;
struct nodee{
	int data,fa,l,r,num,sum;
}a[1100007];
int js=0;

inline void dfs(int zz)
{
	if(a[zz].l)
	dfs(a[zz].l);
	//cout<<a[zz].data<<" ";
	if(a[zz].r)
	dfs(a[zz].r);
}
inline bool child(int x)
{
	if(a[a[x].fa].l==x)
	return 0;
	return 1;
}
inline void updata(int x)
{
	if(x)
	a[x].sum=a[a[x].l].sum+a[a[x].r].sum+a[x].num;
}
inline void rotate(int x)
{
	int fa=a[x].fa;
	if(child(x))
	{
		a[fa].r=a[x].l;
		a[a[x].l].fa=fa;
		a[x].l=fa;
	}
	else
	{
		a[fa].l=a[x].r;
		a[a[x].r].fa=fa;
		a[x].r=fa;
	}
	if(child(fa))
	a[a[fa].fa].r=x;
	else
	a[a[fa].fa].l=x;
	a[x].fa=a[fa].fa;
	a[fa].fa=x;
	updata(fa);
	updata(x);
}
inline void splay(int x,int too)
{
	too=a[too].fa;
	while(a[x].fa!=too)
	{
	//	cout<<x<<" "<<a[x].fa<<" "<<root<<endl;
		int fa=a[x].fa;
		if(a[fa].fa==too)
		{
			rotate(x);
		}
		else if(child(fa)^child(x))//不同
		{
			rotate(x);
			rotate(x);
		} 
		else
		{
			rotate(fa);
			rotate(x);
		}
	}
	if(!too)
	root=x;
}
inline int find(int x,int zz)
{
//	cout<<x<<" "<<zz<<" "<<a[zz].data<<" "<<a[zz].l<<" "<<a[a[zz].l].data<<endl; 
	if(a[zz].data==x)
	{
	//	cout<<"find"<<endl;
		return zz;
	}
	if(x<a[zz].data)
	{
		if(a[zz].l)
		{
		//	cout<<x<<endl;
			int dd=find(x,a[zz].l);
			return dd;
		}
		else
		{
			return zz;
		}
	}
	else
	{
		if(a[zz].r)
		{
			//cout<<x<<endl;
			int dd=find(x,a[zz].r);
			return dd;
		}
		else
		{
			return zz;
		}
	}
}
inline int frontt(int x)
{
	int zz=find(x,root);
	splay(zz,root);
	//cout<<a[11].data<<" "<<a[11].fa<<" "<<root<<" "<<zz<<" "<<a[zz].data<<" "<<a[zz].l<<" "<<a[zz].r<<endl;
	if(x<=a[zz].data)
	{
		zz=a[zz].l;
		while(a[zz].r)
		zz=a[zz].r;
	}
	return zz;
}
inline int behindd(int x)
{
	int zz=find(x,root);
	splay(zz,root);
	if(x>=a[zz].data)
	{
		zz=a[zz].r;
		while(a[zz].l)
		zz=a[zz].l;
	}
	return zz;
}
inline void newnodee(int data,int fa)
{
	++js;
	a[js].data=data;
	a[js].fa=fa;
	a[js].num=a[js].sum=1;
}
inline void cutnodee(int x)
{
	int fa=a[x].fa;
	if(a[x].l==0&&a[x].r==0)
	{
		if(child(x))
		a[fa].r=0;
		else
		a[fa].l=0;
		a[x].fa=0;
		if(root==x)
		{
			root=0;
			return;
		}
		splay(fa,root);
	}
	else if(!a[x].l)
	{
		if(child(x))
		a[fa].r=a[x].r;
		else
		a[fa].l=a[x].r;
		a[a[x].r].fa=fa;
		updata(a[x].r);
		updata(fa);
		if(root==x)
		{
			root=a[x].r;
			return;
		}
		splay(fa,root);
	}
	else if(!a[x].r)
	{
		if(child(x))
		a[fa].r=a[x].l;
		else
		a[fa].l=a[x].l;
		a[a[x].l].fa=fa;
		updata(a[x].l);
		updata(fa);
		if(root==x)
		{
			root=a[x].l;
			return;
		}
		splay(fa,root);
	}
	else
	{
		int c=behindd(a[x].data);
	//	cout<<c<<" "<<a[c].data<<endl;
		if(a[c].fa==x)
		{
			swap(a[x].l,a[c].l);
			swap(a[x].r,a[c].r);
			swap(a[x].fa,a[c].fa);
			if(a[a[c].fa].r==x)
			a[a[c].fa].r=c;
			else
			a[a[c].fa].l=c;
			a[a[c].l].fa=c;
			a[a[c].r].fa=c;
			a[a[x].r].fa=x;
			a[c].r=a[x].r;
			a[a[x].r].fa=c;
			a[x].fa=0;
			a[x].r=0;
			if(root==x)
			{
				root=c;
				updata(a[x].r);
				updata(a[x].fa);
				splay(a[x].fa,root);
				return;
			}
			updata(a[c].r);
			updata(c);
			splay(c,root);
			return;
		}
		swap(a[x].l,a[c].l);
		swap(a[x].r,a[c].r);
		swap(a[x].fa,a[c].fa);
		if(a[a[c].fa].r==x)
		a[a[c].fa].r=c;
		else
		a[a[c].fa].l=c;
		a[a[c].l].fa=c;
		a[a[c].r].fa=c;
		a[a[x].fa].l=x;
		a[a[x].r].fa=x;
		fa=a[x].fa;
		a[fa].l=a[x].r;
		a[a[x].r].fa=fa;
		if(root==x)
		{
			root=c;
			updata(a[x].r);
			updata(fa);
			a[x].fa=0;
			a[x].r=0;
			return;
		}
		updata(a[x].r);
		updata(fa);
		a[x].fa=0;
		a[x].r=0;
		splay(fa,root);
	}
}
inline void add(int x)
{
	if(!root)
	{
		newnodee(x,0);
		root=js;
		return;
	}
	int zz=find(x,root);
//	cout<<zz<<" "<<a[zz].data<<" "<<x<<endl;
//	cout<<root<<endl;
//	for(register int i=1;i<=js;++i)
//	cout<<i<<" "<<a[i].data<<" "<<a[i].l<<" "<<a[i].r<<" "<<a[i].fa<<endl;
	if(a[zz].data==x)
	{
		++a[zz].num;
		++a[zz].sum;
		splay(x,root);
		return;
	}
	newnodee(x,zz);
	if(x>a[zz].data)
	a[zz].r=js;
	else
	{
		a[zz].l=js;
	//	cout<<zz<<" "<<a[zz].l<<" "<<a[a[zz].l].fa<<endl;
	}
	updata(zz);
//	cout<<zz<<" "<<a[zz].l<<" "<<a[a[zz].l].fa<<endl;
	splay(zz,root);
//	cout<<zz<<" "<<a[zz].l<<" "<<a[a[zz].l].fa<<endl;
}
inline void dele(int x)
{
	int zz=find(x,root);
	//cout<<zz<<" "<<a[zz].data<<" "<<a[zz].num<<endl;
	--a[zz].num;
	--a[zz].sum;
//	cout<<zz<<" "<<a[zz].num<<endl;
	if(!a[zz].num)
	{
		updata(a[zz].fa);
		cutnodee(zz);
	}
	else
	{
		updata(zz);
		splay(zz,root);
	}
}
inline int rank1(int x)
{
	int zz=find(x,root);
	splay(zz,root);
	return a[a[zz].l].sum+1;
}
int rank2(int x,int zz,int sum)
{
	if(a[a[zz].l].sum+sum+1==x)
	{
		splay(zz,root);
		return a[zz].data;;
	}
	if(x<a[a[zz].l].sum+sum+1)
	{
		if(a[zz].l)
		{
			int dd=rank2(x,a[zz].l,sum);
			splay(zz,root);
			return dd;
		}
		else
		{
			splay(zz,root);
			return a[zz].data;
		}
	}
	else
	{
		if(a[zz].r)
		{
			int dd=rank2(x,a[zz].r,sum+a[a[zz].l].sum+1);
			splay(zz,root);
			return dd;
		}
		else
		{
			splay(zz,root);
			return a[zz].data;
		}
	}
}
int main()
{
	scanf("%d",&n);
	int op,x;
	for(register int i=1;i<=n;++i)
	{
	//	cout<<a[13].l<<endl;
//	cout<<i<<endl;
		a[0].l=a[0].r=a[0].sum=0;
		scanf("%d%d",&op,&x);
		if(op==1)
		{
			add(x);
		}
		if(op==2)
		{
			dele(x);
		}
		if(op==3)
		{
			printf("%d\n",rank1(x));
		}
		if(op==4)
		{
			printf("%d\n",rank2(x,root,0));
		}
		if(op==5)
		{
			printf("%d\n",a[frontt(x)].data);
		}
		if(op==6)
		{
			printf("%d\n",a[behindd(x)].data);
		}
	//	dfs(root);
	//	cout<<endl;
	//	cout<<root<<endl;
	//	for(register int i=1;i<=js;++i)
	//	cout<<i<<" "<<a[i].data<<" "<<a[i].l<<" "<<a[i].r<<" "<<a[i].fa<<endl;
	}
	return 0;
} 
2021/8/10 13:46
加载中...