Splay 84pts,TLE 求助
查看原帖
Splay 84pts,TLE 求助
1020916
mcmahaoran楼主2025/2/6 09:53

rt,提交记录

Code (各种卡常可能有点丑):

#include<cstdio>
char buf[1<<21],*p1,*p2,*top, buffer[1<<21];
#define getchar() (p1==p2&&(p2=(p1=buf)+fread(buf,1,1<<21,stdin),p1==p2)?0:*p1++)
#define INF 0x7fffffff
#define ls s[0]
#define rs s[1]
using namespace std;

const int N=1e6+5;

namespace OIfast{
	
	inline int read(){
		register int n=0;
		register char c=getchar();
		while(c<'0'||c>'9')c=getchar();
		while(c>='0'&&c<='9'){
			n=(n<<1)+(n<<3)+(c^48);
			c=getchar();
		}
		return n;
	}
	
	inline void print(register int n){
		register short sta[35];
		register short top=0;
		do{
			sta[top++]=n%10;
			n/=10; 
		}while(n);
		while(top)putchar(sta[--top]^48);
		return ;
	}
	
	inline void write(register int n,register char c){
		print(n),putchar(c);
		return ;
	}
	
}using namespace OIfast;

namespace splayTree{
	
	int root=0,tot=0;
	
	struct node{
		int fa,cnt,size;
		int v;
		int s[2];
	}t[N];
	
	inline void init(register int x,register int _v,register int _fa){
		t[x].cnt=t[x].size=1;
		t[x].v=_v,t[x].fa=_fa;
		return ;
	}
	
	inline void pushup(register int x){
		t[x].size=t[t[x].ls].size+t[t[x].rs].size+t[x].cnt;
		return ;
	}
	
	inline void rotate(register int x){
		register int y=t[x].fa;
		register int z=t[y].fa;
		register bool k=(t[y].rs==x);
		t[z].s[t[z].rs==y]=x,t[x].fa=z;
		t[y].s[k]=t[x].s[k^1],t[t[x].s[k^1]].fa=y;
		t[x].s[k^1]=y,t[y].fa=x;
		pushup(y),pushup(x);
		return ;
	}
	
	inline void splay(register int x,register int k){
		while(t[x].fa!=k){
			register int y=t[x].fa;
			register int z=t[y].fa;
			if(z!=k){
				if((t[y].rs==x)^(t[z].rs==y))rotate(x);
				else rotate(y);
			}
			rotate(x);
		}
		if(k==0)root=x;
		return ;
	}
	
	inline void prepare(register int v){
		register int u=root;
		if(u==0)return ;
		while(t[u].s[t[u].v<v]!=0&&t[u].v!=v)u=t[u].s[t[u].v<v];
		splay(u,0);
		return ;
	}
	
	inline void add(register int v){
		register int u=root,f=0;
		while(u!=0&&t[u].v!=v){
			f=u;
			u=t[u].s[t[u].v<v];
		}
		if(u){
			++t[u].cnt;
		}else{
			u=++tot;
			init(u,v,f);
			if(f!=0){
				t[f].s[t[f].v<v]=u;
			}
		}
		splay(u,0);
		return ;
	}
	
	inline int get(register int v,register int f){
		prepare(v);
		register int u=root;
		if(v<t[u].v&&f)return u;
		if(t[u].v<v&&(!f))return u;
		if(t[u].s[f]!=0){
			u=t[u].s[f];
			while(t[u].s[f^1]!=0){
				u=t[u].s[f^1];
			}
		}
		return u;
	}
	
	inline void del(register int v){
		register int a=get(v,0),b=get(v,1);
		splay(a,0),splay(b,a);
		if(t[t[b].ls].cnt>1){
			--t[t[b].ls].cnt;
			splay(t[b].ls,0);
		}else{
			t[b].ls=0;
		}
		return ;
	}
	
	inline int rk(register int v){
		prepare(v);
		return t[t[root].ls].size;
	}
	
	inline int kth(register int k){
		register int u=root;
		if(t[u].size<k)return -1;
		while(1){
			if(k>t[t[u].ls].size+t[u].cnt){
				k-=t[t[u].ls].size+t[u].cnt,u=t[u].rs;
			}else{
				if(t[t[u].ls].size>=k)u=t[u].ls;
				else return splay(u,0),t[u].v;
			}
		}
		return 0;
	}
	
}using namespace splayTree;

int last,sum;

inline void work(){
	register short opt=read();
	register int x=read()^last;
	if(opt==0)return ;
	else if(opt==1){
		add(x);
	}else if(opt==2){
		del(x);
	}else if(opt==3){
		add(x);
		last=rk(x);
		del(x);
	}else if(opt==4){
		last=kth(x+1);
	}else if(opt==5){
		last=t[get(x,0)].v;
	}else if(opt==6){
		last=t[get(x,1)].v;
	}
	if(opt>=3&&opt<=6)sum^=last;
	return ;
}

signed main(){
	add(-INF),add(INF);
	register int n=read(),m=read();
	while(n--)add(read());
	while(m--)work();
	write(sum,'\n');
	return 0;
}
2025/2/6 09:53
加载中...