Splay模版 14pts 求调
查看原帖
Splay模版 14pts 求调
593255
dist_22r楼主2024/7/12 20:20
#include<bits/stdc++.h>
using namespace std;
const int N=1e5+5;
int n,s[4*N],f[4*N],son[4*N][2];
int t[4*N],si[4*N],rt,cnt;
void push_up(int x)
{
	si[x]=s[x]+si[son[x][0]]+si[son[x][1]];
}
void rotate(int x)
{
	int fa=f[x],gf=f[fa],k=(son[fa][1]==x);
	son[gf][son[gf][1]==fa]=x;
	f[x]=gf;
	son[fa][k]=son[x][k^1];
	f[son[x][k^1]]=fa;
	son[x][k^1]=fa;
	f[fa]=x;
	push_up(fa);
	push_up(x);
}
void splay(int x,int flag)
{
	while(f[x]!=flag)
	{
		int fa=f[x],gf=f[fa];
		if(gf!=flag)
		{
			if((son[fa][0]==x)^(son[gf][0]==fa))
			{
				rotate(x);
			}
			else
			{
				rotate(fa);
			}
		}
		rotate(x);
	}
	if(flag==0)
	{
		rt=x;
	}
}
void insert(int x)
{
	int u=rt,fa=0;
	while(u&&t[u]!=x)
	{
		fa=u;
		u=son[u][x>t[u]];
	}
	if(u)
	{
		s[u]++;
	}
	else
	{
		u=++cnt;
		son[u][0]=son[u][1]=0;
		f[cnt]=fa;
		si[cnt]=1;
		s[cnt]=1;
		if(fa)
		{
			son[fa][x>t[u]]=u;
		}
		t[cnt]=x;
	}
	splay(u,0);
}
void find1(int x)
{
	int u=rt;
	if(!u)
	{
		return ;
	}
	while(son[u][x>t[u]]&&x!=t[u])
	{
		u=son[u][x>t[u]];
	}
	splay(u,0);
}
int find2(int x)
{
	int u=rt;
	if(si[u]<x)
	{
		return 0;
	}
	while(1)
	{
		int y=son[u][0];
		if(x>s[u]+si[y])
		{
			x-=s[u]+si[y];
			u=son[u][1];
		}
		else
		{
			if(si[y]>=x)
			{
				u=y;
			}
			else
			{
				return t[u];
			}
		}
	}
}
int next(int x,int k)
{
	find1(x);
	int u=rt;
	if((t[u]>x&&k)||(t[u]<x&&!k))
	{
		return u;
	}
	u=son[u][k];
	while(son[u][k^1])
	{
		u=son[u][k^1];
	}
	return u;
}
void Delete(int x)
{
	int l=next(x,0),r=next(x,1);
	splay(l,0);
	splay(r,l);
	int y=son[r][0];
	if(s[y]>1)
	{
		s[y]--;
		splay(y,0);
	}
	else
	{
		son[r][0]=0;
	}
}
int main()
{
	insert(+2147483647);
	insert(-2147483647);
    cin>>n;
	int tt=0;
	for(int i=1;i<=n;i++)
	{
		int op,x;
		cin>>op>>x;
		if(op==1)
		{
			tt=0;
			insert(x);
		}
		else if(op==2)
		{
			tt=0;
			Delete(x);
		}
		else if(op==3)
		{
			if(tt==x)
			{
				cout<<si[son[rt][0]]<<endl;
				tt=0;
			}
			else
			{
				find1(x);
				tt=x;
				cout<<si[son[rt][0]]<<endl;
			}
		}
		else if(op==4)
		{
			tt=0;
			cout<<find2(x+1)<<endl;
		}
		else if(op==5)
		{
			tt=0;
			cout<<t[next(x,0)]<<endl;
		}
		else
		{
			tt=0;
			cout<<t[next(x,1)]<<endl;
		}
	}
	return 0;
}

rt,只A了2、3两个点,第13点还TLE了

2024/7/12 20:20
加载中...