90分代码求调
查看原帖
90分代码求调
350945
linlioo楼主2021/12/16 14:54

90分T了一个点,会的全用了,求大佬教一下

#include<bits/stdc++.h>
using namespace std;
struct node
{
	int l,r,cnt,siz,key,data;
}a[1100010];
int w,last,sum;
inline int read()
{
	int X=0; bool flag=1; char ch=getchar();
	while(ch<'0'||ch>'9') {if(ch=='-') flag=0; ch=getchar();}
	while(ch>='0'&&ch<='9') {X=(X<<1)+(X<<3)+ch-'0'; ch=getchar();}
	if(flag) return X;
	return ~(X-1);
}
inline void pushup(int k)
{
	a[k].siz=a[k].cnt+a[a[k].l].siz+a[a[k].r].siz;
}
inline void right_zig(int &k)
{
	int kk=a[k].l;
	a[k].l=a[kk].r;
	a[kk].r=k;
	pushup(k);
	pushup(kk);
	k=kk;
}
inline void left_zig(int &k)
{
	int kk=a[k].r;
	a[k].r=a[kk].l;
	a[kk].l=k;
	pushup(k);
	pushup(kk);
	k=kk;
}
inline void inser(int &k,int q)
{
	if(k==0)
	{
		k=++w;
		a[k].cnt=1;
		a[k].data=q;
		a[k].key=rand();
		pushup(k);
	}
	else if(a[k].data==q)
	{
		a[k].cnt++;
		pushup(k);
	}
	else if(a[k].data>q)
	{
		inser(a[k].l,q);
		if(a[a[k].l].key<a[k].key)
		{
			right_zig(k);
		}
		else 
		{
			pushup(k);
		}
	}
	else 
	{
		inser(a[k].r,q);
		if(a[a[k].r].key<a[k].key)
		{
			left_zig(k);
		}
		else 
		{
			pushup(k);
		}
	}
}
inline void delet(int k,int q)
{
	if(a[k].data>q)
	{
		delet(a[k].l,q);
	}
	else if(a[k].data<q)
	{
		delet(a[k].r,q);
	}
	else 
	{
		a[k].cnt--;
	}
	pushup(k);
}
inline int ran(int k,int q)
{
	pushup(k);
	if(k==0)
	{
		return 0;
	}
	if(a[k].data>q)
	{
		return ran(a[k].l,q);
	}
	else if(a[k].data<q)
	{
		return ran(a[k].r,q)+a[k].cnt+a[a[k].l].siz;
	}
	else return a[a[k].l].siz;
}
inline void find(int k,int q)
{
	if(a[a[k].l].siz>=q)
	{
		find(a[k].l,q);
	}
	else if(a[a[k].l].siz+a[k].cnt<q)
	{
		find(a[k].r,q-a[k].cnt-a[a[k].l].siz);
	}
	else 
	{
		int ans=a[k].data;
		sum^=ans;
		last=ans;
		return ;
	}
}
inline int lower(int k,int q)
{
	if(k==0)
	{
		return -2100000000;
	}
	if(a[k].data>=q)
	{
		return lower(a[k].l,q);
	}
	else 
	{
		if(a[k].cnt)
		return max(a[k].data,lower(a[k].r,q));
		else return max(lower(a[k].r,q),lower(a[k].l,q));
	}
}
inline void write(int X)
{
	if(X<0) {X=~(X-1); putchar('-');}
	if(X>9) write(X/10);
	putchar(X%10+'0');
}

inline int upper(int k,int q)
{
	if(k==0)
	{
		return 2100000000;
	}
	else if(a[k].data<=q)
	{
		return upper(a[k].r,q);
	}
	else
	{
		if(a[k].cnt)
		return min(upper(a[k].l,q),a[k].data);
		else return min(upper(a[k].l,q),upper(a[k].r,q)); 
	}
}
int main(int argc, char const *argv[])
{
	int root=0,n,m;
	n=read();
	m=read();
	while(n--)
	{
		int k=read();
		inser(root,k);
	}
	for(int i=1;i<=m;i++)
	{
		int k=read(),q=read();
		q^=last;
		if(k==1)
		{
			inser(root,q);
		}
		else if(k==2) 
		{
			delet(root,q);
		}
		else if(k==3)
		{
			int ans=ran(root,q)+1;
			sum^=ans;
			last=ans;
		}
		else if(k==4)
		{
			find(root,q);
		}
		else if(k==5)
		{
			int ans=lower(root,q);
			sum^=ans;
			last=ans;
		}
		else 
		{
			int ans=upper(root,q);
			sum^=ans;
			last=ans;
		}
	}
	write(sum);
	return 0;
}
2021/12/16 14:54
加载中...