fhqtreap玄学TLE
查看原帖
fhqtreap玄学TLE
145119
WhiteLabs楼主2021/4/21 20:41

明明本地跑的没问题,自从用了srand(time(0))后,每次交都有不一样的tle,而且还是最小的几个数据点经常tle

#include <bits/stdc++.h>
using namespace std;
inline int read()
{
	int x=0,f=1;char c=getchar();
	while(!isdigit(c)){if(c=='-')f=-1;c=getchar();}
	while(isdigit(c)){x=(x<<1)+(x<<3)+c-48;c=getchar();}
	return x*f;
}
int n,m;
int id[200007];
struct fhq_treap{int ls,rs,fa,size,val,key;}fhq[2000007];
int N,Root,_x,_y,_z;
int newNode(int val)
{
	N++;
	fhq[N].val=val;
	fhq[N].key=rand();
	fhq[N].size=1;
	id[val]=N; 
	return N;
} 
inline void pushUp(int root){fhq[root].size=fhq[fhq[root].ls].size+fhq[fhq[root].rs].size+1;}
void split(int root,int k,int &LR,int &RR,int faLR=0,int faRR=0){
	if(!root){LR=RR=0;return;}
	if(k<=fhq[fhq[root].ls].size)
	{
		fhq[root].fa=faRR;RR=root;
		split(fhq[root].ls,k,LR,fhq[root].ls,faLR,root);
	}
	else
	{
		fhq[root].fa=faLR;LR=root;
		split(fhq[root].rs,k-(fhq[fhq[root].ls].size+1),fhq[root].rs,RR,root,faRR);
	}
	pushUp(root); 
}
int merge(int LR,int RR){
	if(!LR||!RR) return LR|RR;
	if(fhq[LR].key<fhq[RR].key)
	{
		fhq[LR].rs=merge(fhq[LR].rs,RR);
		fhq[fhq[LR].rs].fa=LR;
		pushUp(LR);return LR;
	}
	else{
		fhq[RR].ls=merge(LR,fhq[RR].ls);
		fhq[fhq[RR].ls].fa=RR;
		pushUp(RR);return RR;
	}
}
inline void insert(int val,int pos){
	split(Root,pos,_x,_y);
	Root=merge(merge(_x,newNode(val)),_y);
} 
inline void erase(int k){
	split(Root,k,_x,_z);split(_x,k-1,_x,_y);
	_y=merge(fhq[_y].ls,fhq[_y].rs);
	Root=merge(merge(_x,_y),_z);
}
inline int Kth(int k){
	split(Root,k,_x,_z);split(_x,k-1,_x,_y); 
	int ans=fhq[_y].val;Root=merge(_x,merge(_y,_z));
	return ans;
}
int find(int u)
{
	int ans(fhq[fhq[u].ls].size+1);
	while(u^Root)
	{
		if(fhq[fhq[u].fa].ls^u) ans+=fhq[fhq[fhq[u].fa].ls].size+1;
		u=fhq[u].fa;
	}
	return ans;
}
int main()
{
	srand(time(0));
	n=read(),m=read();
	int X,t;
	for(int i=1;i<=n;i++){
		X=read();
		insert(X,i);
	}
	char opt[10];
	for(int i=1;i<=m;i++)
	{
		scanf("%s",opt);X=read();
		if(opt[0]=='T')
		{
			int k=find(id[X]);
			erase(k);
			Root=merge(newNode(X),Root); 
		}
		if(opt[0]=='B')
		{
			int k=find(id[X]);
			erase(k);
			insert(X,n-1);
		}
		if(opt[0]=='I')
		{
			t=read();
			int k=find(id[X]);
			erase(k);
			split(Root,k+t-1,_x,_y); 
			merge(_x,merge(newNode(X),_y));
		}
		if(opt[0]=='A') printf("%d\n",find(id[X])-1);
		if(opt[0]=='Q') printf("%d\n",Kth(X));
	}
	return 0;
} 
2021/4/21 20:41
加载中...