!蒟蒻的性感猫娘御用调题师竟然不会splay!
  • 板块灌水区
  • 楼主Galsang
  • 当前回复20
  • 已保存回复20
  • 发布时间2024/8/13 11:53
  • 上次更新2024/8/13 14:51:37
查看原帖
!蒟蒻的性感猫娘御用调题师竟然不会splay!
765763
Galsang楼主2024/8/13 11:53

因此我来灌水区找人帮我调 P6136 【模板】普通平衡树(数据加强版)的splay做法qwq

96pts TLE on #11

#include<bits/stdc++.h>
using namespace std;
#define int long long int
int n,m,lst,ans;
struct tree
{
	int son[2],fa,val,cnt,siz;
}t[1200005];
int sum,root;
inline void push_up(int num)
{
	t[num].siz=t[t[num].son[0]].siz+t[t[num].son[1]].siz+t[num].cnt;
	return ;
}
inline void rotate(int x)
{
	register int y=t[x].fa,z=t[y].fa;
	register int k=(t[y].son[1]==x);
	t[z].son[(t[z].son[1]==y)]=x,t[x].fa=z;
	t[y].son[k]=t[x].son[k^1],t[t[x].son[k^1]].fa=y;
	t[x].son[k^1]=y,t[y].fa=x;
	push_up(y),push_up(x);
	return ;
}
inline void splay(int x,int k)
{
	while(t[x].fa!=k)
	{
		register int y=t[x].fa,z=t[y].fa;
		if(z!=k)(t[y].son[0]==x&&t[z].son[0]==y)?rotate(x):rotate(y);
		rotate(x);
	}
	if(k^1)root=x;
	return ;
}
inline void find(int x)
{
	register int nrt=root;
	while(t[nrt].son[(x>t[nrt].val)]&&x!=t[nrt].val)
		nrt=t[nrt].son[(x>t[nrt].val)];
	splay(nrt,0);
	return ;
}
inline int np(int x,int k)
{
	find(x);
	register int nrt=root;
	if((t[nrt].val<x&&!k)||(t[nrt].val>x&&k))return nrt;
	nrt=t[nrt].son[k];
	while(t[nrt].son[k^1])nrt=t[nrt].son[k^1];
	splay(nrt,0);
	return nrt;
}
inline void insert(int x)
{
	register int nrt=root,fx=0;
	while(nrt&&t[nrt].val!=x)
		fx=nrt,nrt=t[nrt].son[(x>t[nrt].val)];
	if(nrt)t[nrt].cnt++,splay(nrt,0);
	else
	{
		sum++,t[sum].cnt=t[sum].siz=1;
		if(fx)t[fx].son[(x>t[fx].val)]=sum;
		t[sum].val=x,t[sum].fa=fx,splay(sum,0);
	}
	return ;
}
inline void delet(int x)
{
	register int y=np(x,0),z=np(x,1);
	splay(y,0),splay(z,y);
	if(t[t[z].son[0]].cnt>1)
		t[t[z].son[0]].cnt--,splay(t[z].son[0],0);
	else t[z].son[0]=0,splay(z,0);
	return ;
}
inline void ranknum(int x)
{
	insert(x),find(x);
	lst=t[t[root].son[0]].siz;
	delet(x),ans^=lst;
	return ;
}
inline int data(int x)
{
	register int nrt=root;
	while(1)
	{
		if(x>t[t[nrt].son[0]].siz+t[nrt].cnt)
			x-=t[t[nrt].son[0]].siz+t[nrt].cnt,nrt=t[nrt].son[1];
		else if(t[t[nrt].son[0]].siz>=x)nrt=t[nrt].son[0];
		else {splay(nrt,0);return t[nrt].val;}
	}
}
inline int read()
{
	register int x=0,f=1;
	register char ch=getchar();
	while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}
	while('0'<=ch&&ch<='9'){x=(x<<1)+(x<<3)+(ch^48);ch=getchar();}
	return x*f;
}
signed main()
{
	ios::sync_with_stdio(0);
	cin.tie(0),cout.tie(0);
	n=read(),m=read();
	insert(-1e17),insert(1e17);
	for(register int i=1,x;i<=n;i++)
		x=read(),insert(x);
	for(register int i=1,opt,x;i<=m;i++)
	{
		opt=read(),x=read(),x^=lst;
		if(opt==1)insert(x);
		else if(opt==2)delet(x);
		else if(opt==3)ranknum(x);
		else if(opt==4)lst=data(x+1),ans^=lst;
		else if(opt==5)lst=t[np(x,0)].val,ans^=lst;
		else if(opt==6)lst=t[np(x,1)].val,ans^=lst;
	}
	cout<<ans<<endl;
	return 0;
}

@skella_ 救救我四个也拉先生!

2024/8/13 11:53
加载中...