splay求助
查看原帖
splay求助
64976
hewo楼主2021/2/1 11:19

只过了1 4

3 WA了

其他全TLE

#include<bits/stdc++.h>
using namespace std;
#define inf 0x7fffffff
const int MX=10000010;
inline int read()
{
    int x=0,f=1;char ch=getchar();
    while (!isdigit(ch)){if (ch=='-') f=-1;ch=getchar();}
    while (isdigit(ch)){x=x*10+ch-48;ch=getchar();}
    return x*f;
}
//cnt 当前节点重复个数
int tree[MX][2],value[MX],father[MX],size[MX],cnt[MX];
int root;
int tot=0;
int lans[MX];
int ks=0;
inline int creat(int v)
{
	value[++tot]=v;
	size[tot]=cnt[tot]=1;
	return tot;
}
inline int get_lr(int x)//获得左右信息
{
	return tree[father[x]][1]==x;//left-->0 right-->1
}
inline void pushup(int x)
{
	if(x)
	{
		size[x]=size[tree[x][0]]+size[tree[x][1]]+cnt[x];
	}
}
inline void rotate(int x)
{
	int fa=father[x],gfa=father[father[x]];
	int p=get_lr(x); 
	tree[fa][p]=tree[x][p^1],father[tree[fa][p]]=fa;
	father[fa]=x;
	tree[x][p^1]=fa;
	father[x]=gfa;
	if(gfa)
	{
		tree[gfa][tree[gfa][1]==fa]=x;
	}
	pushup(fa),pushup(x);

}
inline void splay(int x)
{
	for(int fa;fa=father[x];rotate(x))
	{
		if(father[fa])
		{
			rotate(get_lr(x)==get_lr(fa)?fa:x);
		}
	}
	root=x;
}
inline void insert(int x)
{
	//int fa=father[x],gfa=father[fa];
	if(!root)
	{
		value[root=++tot]=x;
		size[tot]=cnt[tot]=1;
		return ;
	}
	int now=root,fa=0;
	while(1)
	{
		if(value[now]==x)
		{
			cnt[now]++;
			pushup(now),pushup(fa);
			splay(now);
			return ;
		}
		fa=now,now=tree[now][x>value[now]];
		if(!now)
		{
			father[++tot]=fa,value[tot]=x;
			size[tot]=cnt[tot]=1;
			tree[fa][value[fa]<x]=tot;
			pushup(fa);
			splay(tot);
			return ;
		}
	}
}
inline int getrank(int x)
{
	if(!root) return 0;
	int now=root,ans=0;	
	while(now)
	{
		if(x<value[now])
		{
			now=tree[now][0];
		}
		else
		{
			ans+=size[tree[now][0]];
			if(x==value[now])
			{
				splay(now);
				return ans+1;
			}
			ans+=cnt[now],now=tree[now][1];
		}
	}
	return ans+1;
}
inline int getnum(int x)
{
	if(!root) return 0;
	int now=root;
	while(1)
	{
		if(x<=size[tree[now][0]]) now=tree[now][0];
		else
		{
			int p=size[tree[now][0]]+cnt[now];
			if(x<=p) return value[now];
			x-=p;
			now=tree[now][1];
		}
	}
}
/*
inline int getpre(int x)
{
	int now=root,ans=0;
	while(now)
	{
		if(x>value[now])
		{
			ans=value[now];
			now=tree[now][1];
		}
		else
		{
			now=tree[now][0];
		}
	}
}
inline int getsuf(int x)
{
	int now=root,ans=0;
	while(now)
	{
		if(x<value[now])
		{
			ans=value[now];
			now=tree[now][0];
		}
		else 
		{
			now=tree[now][1];
		}
	}
}
*/
inline int getpre()
{
	int now=tree[root][0];
	while(tree[now][1])
	{
		now=tree[now][1];
	}
	return now;
}
inline int getsuf()
{
	int now=tree[root][1];
	while(tree[now][0]) 
	{
		now=tree[now][0];
	}
	return now;
}
inline void remove(int x)
{
	getrank(x);
	if(cnt[root]>1)
	{
		cnt[root]--;
		pushup(root);
		return ;
	}
	if(!tree[root][0]*tree[root][1]){
    	root=tree[root][0]+tree[root][1];
        father[root]=0; return;
    }
    /*
	else if(!tree[root][0])
	{
		root=tree[root][0];
		father[tree[root][0]]=0;
		return ;
	}
	else if(!tree[root][1])
	{
		root=tree[root][1];
		father[tree[root][1]]=1;
		return ;
	}
	*/
	splay(getpre());
	tree[root][1]=tree[tree[root][1]][1];
	father[tree[root][1]]=root;
	pushup(root);
}
int main()
{
	int n,m;
	n=read(),m=read();
	for(int i=1;i<=n;i++)
	{
		int inb;
		inb=read();
		insert(inb);
	}
	for(int i=1;i<=m;i++)
	{
		int ina,inb;
		ina=read(),inb=read();
		if(ina==1)
		{
			insert(inb);
		}
		else if(ina==2)
		{
			remove(inb);
		}
		else if(ina==3)
		{
			inb=(inb xor lans[ks]);
			//cout<<inb<<endl;
			lans[++ks]=getrank(inb);
		}
		else if(ina==4)
		{
			inb=(inb xor lans[ks]);
			lans[++ks]=getnum(inb);
			//cout<<endl<<inb<<"	"<<lans[ks]<<endl;
		}
		else if(ina==5)
		{
			inb=(inb xor lans[ks]);
			//cout<<inb<<endl;
			insert(inb);
			lans[++ks]=value[getpre()];
			remove(inb);
			//cout<<endl<<inb<<"	"<<lans[ks]<<endl;
		}
		else if(ina==6)
		{
			inb=(inb xor lans[ks]);
			//cout<<inb<<endl;
			insert(inb);
			lans[++ks]=value[getsuf()];
			remove(inb);
			//cout<<endl<<inb<<"	"<<lans[ks]<<endl;
		}
	}
	int rans=0;
	for(int i=2;i<=ks;i++)
	{
		lans[i]=(lans[i] xor lans[i-1]);
	}
	cout<<lans[ks]<<endl;
	return 0;
}
2021/2/1 11:19
加载中...