蒟蒻求助splay模板,52pts
查看原帖
蒟蒻求助splay模板,52pts
576713
BINGZHIHUIHEN楼主2022/8/27 11:38

WA 6个测试点, TLE 3个测试点,有没有大神帮忙看看,自己看了半天了……

#include<bits/stdc++.h>
using namespace std;
namespace IO
{
	template <typename T> inline void read(T& res)
	{
		int f=1;res=0;char ch=getchar();
		while(ch<'0' or ch>'9'){if(ch=='-')f=-1;ch=getchar();}
		while(ch>='0' and ch<='9'){res=(res<<1)+(res<<3)+(ch^48);ch=getchar();}
		res*=f;
	}
	template <typename T,typename... Args>inline void read(T& t,Args&... args)
	{
		read(t);read(args...);
	}
	void print(int x)
	{
		if(x<0)putchar('-'),x=-x;
		if(x>9)print(x/10);
		putchar(x%10+'0');
	}
}
using namespace IO;
const int N=1e5+1e6+20;
#define il inline
struct splayy
{
	int v;//节点权值
	int cnt;//节点数量
	int size;//子树+自身节点大小
	int s[2];//两个儿子
	int p;//父节点
	il void init(int _p,int _v)
	{
		v=_v,p=_p;cnt=1;
	}
}a[N];
int idx,root,inf=0x7fffffff-5;
il void pushup(int x)
{
	a[x].size=a[a[x].s[0]].size+a[a[x].s[1]].size+a[x].cnt;
}

il void rotate(int x)
{
	int y=a[x].p,z=a[y].p;
	int k= a[y].s[1]==x;
	a[z].s[a[z].s[1]==y]=x,a[x].p=z;
	a[y].s[k]=a[x].s[k^1],a[a[x].s[k^1]].p=y;
	a[x].s[k^1]=y,a[y].p=x;
	pushup(y),pushup(x);
}
il void splay(int x,int k)
{
	while(a[x].p!=k)
	{
		int y=a[x].p,z=a[y].p;
		if(z!=k)
		{
			if((a[y].s[0]==x) ^ (a[z].s[0]==y))rotate(x);//折线形
			else rotate(y);
		}
		rotate(x);
	}
	if(k==0)root=x;
}
il void find(int v)//找到元素v,并将该节点转到根
{
	int x=root;
	while(a[x].v!=v and a[x].s[v>a[x].v])
	{
		x=a[x].s[v>a[x].v];
	}
	splay(x,0);
}
il int get_pre(int v)
{
	find(v);
	int x=root;
	if(a[x].v<v)return x;
	x=a[x].s[0];
	while(a[x].s[1])x=a[x].s[1];
	splay(x,0);
	return x;
}
il int get_suf(int v)
{
	find(v);
	int x=root;
	if(a[x].v>v)return x;
	x=a[x].s[1];
	while(a[x].s[0])x=a[x].s[0];
	splay(x,0);
	return x;
}

il void insert(int v)
{
	int x=root,p=0;
	while(x and a[x].v!=v)
	{
		p=x;x=a[x].s[v>a[x].v];
	}
	if(x)++a[x].cnt;
	else 
	{
		x=++idx;
		a[p].s[v>a[p].v]=x;
		a[x].init(p,v);
	}
	splay(x,0);
} 
il void del(int v)
{
	int pre=get_pre(v);
	int suf=get_suf(v);
	splay(pre,0);splay(suf,pre);
	int del=a[suf].s[0];
	if(a[del].cnt>1)
	{
		--a[del].cnt;splay(del,0);
	}
	else 
	{
		a[suf].s[0]=0;splay(suf,0);
	}
}
il int get_rank(int v)//查询v 的排名
{
	insert(v);
	int res=a[a[root].s[0]].size;
	del(v);
	return res;
}
il int get_val(int k)//查询排名为k的数
{
	int x=root;
	while(1)
	{
		int y=a[x].s[0];
		if(a[y].size+a[x].cnt<k)
		{
			k-=a[y].size+a[x].cnt;
			x=a[x].s[1];
		}
		else 
		{
			if(a[y].size>=k)x=a[x].s[0];
			else break;
		}
	}
	splay(x,0);
	return a[x].v;
}

int n,opt,x,m,last,ans;
signed main()
{
	insert(-inf);insert(inf);root=1;
	read(m,n);
	while(m--)
	{
		read(x);insert(x);
	}
	while(n--)
	{
		read(opt,x);
		if(opt==1)insert(x);
		else if(opt==2)del(x);
		if(opt==1 or opt==2)continue;
		
		x^=last;
		
		if(opt==3)last=get_rank(x);
		else if(opt==4)last=get_val(x+1);
		else if(opt==5)last=a[get_pre(x)].v;
		else last=a[get_suf(x)].v;
		
		ans^=last;
	}
	printf("%d",ans);
	return 0;
}
2022/8/27 11:38
加载中...