萌新Splay WA#11求助!!!
查看原帖
萌新Splay WA#11求助!!!
377050
Linear_Basis楼主2021/1/22 09:49

QAQ

#include <bits/stdc++.h>
#define N 100005
using namespace std;
int n,root,son[N][2],cnt[N],val[N],t[N],f[N],Q,idx;
int search(int p,int x)
{
	while(val[p]!=x)
	{
		if(x<val[p])
		{
			if(son[p][0])
			{
				p=son[p][0];
			}
			else
			{
				return p;
			}
		}
		else if(x>val[p])
		{
			if(son[p][1])
			{
				p=son[p][1];
			}
			else
			{
				return p;
			}
		}
	}
	return p;
}
void rotate(int x)
{
	int y=f[x],z=f[f[x]],w=son[y][1]==x;
	son[z][son[z][1]==y]=x;
	f[x]=z;
	son[y][w]=son[x][w^1];
	f[son[x][w^1]]=y;
	son[x][w^1]=y;
	f[y]=x;
	cnt[y]=cnt[son[y][1]]+cnt[son[y][0]]+t[y];
	cnt[x]=cnt[son[x][0]]+cnt[son[x][1]]+t[x];
}
void splay(int x)
{
	while(f[x])
	{
		int y=f[x],z=f[f[x]];
		if(z==0)
		{
			rotate(x);
		}
		else
		{
			if(son[z][0]==y^son[y][0]==x)
			{
				rotate(x);
			}
			else
			{
				rotate(y);
			}
			rotate(x);
		}
	}
	root=x;
}
void ins(int x)
{
	if(idx==0)
	{
		idx=1;
		root=1;
		t[1]=1;
		val[1]=x;
		cnt[1]=1;
	}
	else
	{
		int k=search(root,x),u;
		if(val[k]==x)
		{
			t[k]++;
			u=k;
		}
		else
		{
			val[++idx]=x;
			f[idx]=k;
			son[k][x>val[k]]=idx;
			t[idx]=1;
			cnt[idx]=1;
			u=idx;
		}
		while(k)
		{
			cnt[k]++;
			k=f[k];
		}
		splay(u);
	}
}
void del(int x)
{
	int k=search(root,x);
	if(val[k]==x)
	{
		splay(k);
		if(t[k]>1)
		{
			t[k]--;
		}
		else
		{
			if(!son[k][0])
			{
				root=son[k][1];
				f[root]=0;
			}
			else if(!son[k][1])
			{
				root=son[k][0];
				f[root]=0;
			}
			else
			{
				int p=search(son[k][0],0x3f3f3f3f);
				splay(p);
				f[son[k][1]]=p;
				son[p][1]=son[k][1];
				cnt[root]--;
			}
			son[k][0]=son[k][1]=f[k]=val[k]=cnt[k]=t[k]=0;
		}
	}
}
int pos(int x)
{
	int k=search(root,x);
	splay(k);
	return cnt[son[k][0]]+1;
}
int num(int x)
{
	int k=root;
	while(x<=cnt[son[k][0]]||x>cnt[son[k][0]]+t[k])
	{
		if(x<=cnt[son[k][0]])
		{
			k=son[k][0];
		}
		else
		{
			x-=cnt[son[k][0]]+t[k];
			k=son[k][1];
		}
	}
	return val[k];
}
int pre(int x)
{
	int k=search(root,x);
	if(val[k]<x)
	{
		return val[k];
	}
	splay(k);
	return val[search(son[k][0],0x3f3f3f3f)];
}
int suc(int x)
{
	int k=search(root,x);
	if(val[k]>x)
	{
		return val[k];
	}
	splay(k);
	return val[search(son[k][1],0xc0c0c0c0)];
}
int main()
{
	cin>>Q;
	while(Q--)
	{
		int opt,x;
		cin>>opt>>x;
		switch(opt)
		{
			case 1:
				ins(x);
				break;
			case 2:
				del(x);
				break;
			case 3:
				cout<<pos(x)<<endl;
				break;
			case 4:
				cout<<num(x)<<endl;
				break;
			case 5:
				cout<<pre(x)<<endl;
				break;
			case 6:
				cout<<suc(x)<<endl;
				break;
		}
	}
	return 0;
}
2021/1/22 09:49
加载中...