萌 新 求 助 Splay
查看原帖
萌 新 求 助 Splay
91956
Dreamweaver楼主2021/6/5 20:51
#include<bits/stdc++.h>
using namespace std;
#define re register
#define maxm 100000
#define mod 100007
int cnt,root;
struct node
{
	int value,size,cnt,fa,son[2];
	#define ls(x)	tree[x].son[0]
	#define rs(x)	tree[x].son[1]
	#define v(x)	tree[x].value
	#define s(x)	tree[x].size
	#define f(x)	tree[x].fa
	#define c(x)	tree[x].cnt
	
}tree[100010];
inline void update(int x)
{
	s(x)=c(x)+s(ls(x))+s(rs(x));
}
inline bool which(int x)
{
	return rs(f(x))==x;
}
void rotate(int x)
{
	int f=f(x);
	int g=f(f);
	int w=which(x);
	tree[f].son[w]=tree[x].son[w^1];
	f(tree[f].son[w])=f;
	tree[x].son[w^1]=f;
	f(f)=x;
	f(x)=g;
	if(g)	tree[g].son[rs(f)==f]=x;
	update(f);
	update(x);
	return ;
} 
inline void  Splay(int x,int goal)
{	
	while(f(x)!=goal)
	{
		int f=f(x);
		int g=f(f);
		if(g!=goal)	rotate((which(x)^which(f))?x:f);
		rotate(x);
	}
	if(!goal)	root=x;
	return ;
}
inline void insert(int n)
{
	if(!root)
	{
		root=++cnt;
		ls(cnt)=rs(cnt)=0;
		v(cnt)=n;
		s(cnt)=c(cnt)=1;
		f(cnt)=0;
		return ;
	}
	int now=root,f=0;
	while(1)
	{
		if(v(now)==n)
		{
			++c(now);
			update(now);
			Splay(now,0);
			return ;
		}
		f=now;
		now=tree[f].son[v(f)<n];
		if(!now)
		{
			tree[f].son[v(f)<n]=++cnt;
			v(cnt)=n;
			ls(cnt)=rs(cnt)=0;
			f(cnt)=f;
			s(cnt)=c(cnt)=1;
			++s(f);
			Splay(cnt,0);
			return ;
		}
	}
	return ;
}
int getrank(int n)
{
	int now=root,ans=1;
	while(1)
	{
		if(n<v(now))
			now=ls(now);
		else
		{
			ans+=s(ls(now));
			if(v(now)==n)
			{
				Splay(now,0);
				return ans;
			}
			ans+=c(now);
			now=rs(now);
		}
	}
	return 0;
}
int getnum(int n)
{
	int now=root;
	while(1)
	{
		if(s(ls(now))>=n)	
			now=ls(now);
		else
		{
			n-=s(ls(now));
			if(c(now)>=n)
			{
				Splay(now,0);
				return v(now);
			}
			n-=c(now);
			now=rs(now);
		}
	}
	return 0;
}
inline int bef()
{
	int x=ls(root);
	while(rs(x))	x=rs(x);
	return x;
}
inline int aft()
{
	int x=rs(root);
	while(ls(x))	x=ls(x);
	return x;
}
void del(int n)
{
	int r=getrank(n);
	int x=root;
	if(c(x)>1)	
	{
		c(x)--;
		return ;
	}
	if(!ls(x)&&!rs(x))
	{
		root=0;
		return ;
	}
	if(!ls(x))
	{
		root=rs(x);
		f(rs(x))=0;
		return ;
	}
	if(!rs(x))
	{
		root=ls(x);
		f(ls(x))=0;
		return ;
	}
	int q=bef();
	int h=aft();
	Splay(q,0);
	Splay(h,q);
	if(c(ls(h))>1)
	{
		--c(ls(h));
		return ;
	}
	else
		ls(h)=0;
	return ;
}
inline int read(){
    int x=0,f=1;char ch=getchar();
    while (ch<'0'||ch>'9') {if(ch=='-')f=-1; ch=getchar();}
    while (ch>='0'&&ch<='9'){x=(x<<3)+(x<<1)+ch-'0'; ch=getchar();}
    return x*f;
}
int main()
{
 	//freopen("a.in","r",stdin);
	//freopen("a.out","w",stdout);
	int t=read();
	while(t--)
	{
		int op=read(),n=read();
		switch(op)
		{
			case 1:
				insert(n);
				break;

			case 2:
				del(n);
				break;
				
			case 3:
				cout<<getrank(n)<<'\n';
				break;
				
			case 4:
				cout<<getnum(n)<<'\n';
				break;
				
			case 5:
				insert(n),cout<<v(bef())<<'\n',del(n);
				break;
			
			case 6:
				insert(n),cout<<v(aft())<<'\n',del(n);
				break;
		}
	}
    return 0;
}

2021/6/5 20:51
加载中...