Treap 52pts纯MLE求助!!!
查看原帖
Treap 52pts纯MLE求助!!!
575698
262620zzj楼主2023/11/12 22:23
#include<bits/stdc++.h>
using namespace std;
template<typename T>void read(T &x){
	x=0;int f=1;char ch=getchar();
	while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}
	while(ch>='0'&&ch<='9'){x=(x<<1)+(x<<3)+(ch^48);ch=getchar();}
	x*=f;
}
template<typename T,typename ...Args>
void read(T &x,Args &...rest){read(x);read(rest...);}
const int N=1.1e6+5,INF=2147483647;

int n,m,last,ans;
int ls[N],rs[N],val[N],prio[N],cnt[N],siz[N],tot,root;
void push_up(int p){siz[p]=siz[ls[p]]+siz[rs[p]]+cnt[p];}
void L_rotate(int &p){
	int fa=rs[p];
	rs[p]=ls[fa];
	ls[fa]=p;
	push_up(p);
	push_up(fa);
	p=fa;
}
void R_rotate(int &p){
	int fa=ls[p];
	ls[p]=rs[fa];
	rs[fa]=p;
	push_up(p);
	push_up(fa);
	p=fa;
}
void insert(int &p,int x){
	if(!p){
		p=++tot;
		val[tot]=x;
		prio[tot]=rand();
		cnt[tot]=siz[tot]=1;
		return;
	}
	if(x<val[p]){
		insert(ls[p],x);
		if(prio[ls[p]]>prio[p])R_rotate(p);
	}
	else if(x>val[p]){
		insert(rs[p],x);
		if(prio[rs[p]]>prio[p])L_rotate(p);
	}
	else ++cnt[p];
	push_up(p);
}
void remove(int &p,int x){
	if(x==val[p]){
		if(cnt[p]>1){
			cnt[p]--;
			siz[p]--;
			return;
		}
		if(ls[p]||rs[p]){
			if(!rs||prio[ls[p]]>prio[rs[p]])
				R_rotate(p),remove(ls[p],x);
			else L_rotate(p),remove(rs[p],x);
			push_up(p);
		}
		else p=0;
	}
	else if(x<val[p])remove(ls[p],x);
	else remove(rs[p],x);
	push_up(p);
}
int Rank(int p,int x){
	if(!p)return 1;
	if(x<val[p])return Rank(ls[p],x);
	if(x==val[p])return siz[ls[p]]+1;
	return siz[ls[p]]+cnt[p]+Rank(rs[p],x);
}
int kth(int p,int x){
	if(x<=siz[ls[p]])return kth(ls[p],x);
	if(x<=siz[ls[p]]+cnt[p])return val[p];
	return kth(rs[p],x-siz[ls[p]]-cnt[p]);
}
int precursor(int p,int x){
	if(!p)return -INF;
	int res;
	if(x<=val[p])res=precursor(ls[p],x);
	else{
		res=precursor(rs[p],x);
		if(res==-INF)res=val[p];
	}
	return res;
}
int successor(int p,int x){
	if(!p)return INF;
	int res;
	if(x>=val[p])res=successor(rs[p],x);
	else{
		res=successor(ls[p],x);
		if(res==INF)res=val[p];
	}
	return res;
}

int main(){
	srand(time(0));
	read(n,m);
	for(int i=1,a;i<=n;i++){
		read(a);
		insert(root,a);
	}
	for(int i=1,op,x;i<=m;i++){
		read(op,x);
		x^=last;
		if(op==1)insert(root,x);
		if(op==2)remove(root,x);
		if(op==3)last=Rank(root,x);
		if(op==4)last=kth(root,x);
		if(op==5)last=precursor(root,x);
		if(op==6)last=successor(root,x);
		if(op>2)ans^=last;
	}
	printf("%d",ans);
	return 0;
}

记录

2023/11/12 22:23
加载中...