替罪羊树RE了八个怎么办
查看原帖
替罪羊树RE了八个怎么办
170882
rrrrr楼主2021/1/22 12:45
#include<bits/stdc++.h>
using namespace std;
const double alpha=0.75;
const int maxn=1100005;
struct st
{
	struct node
	{
		int l,r,v,vid,siz;
		bool dea;
		void nw(int x){l=r=0;siz=vid=1;dea=0;v=x;}
	}t[maxn];
	int mem[maxn];
	int rt,sum,cnt,idn;
	inline int bad(int o){return max((double)t[t[o].r].siz,(double)t[t[o].l].siz)>alpha*t[o].siz;}
	void clear()
	{
		rt=sum=cnt=idn=0;
	}
	void upda(int o)
	{
		t[o].siz=t[t[o].l].siz+t[t[o].r].siz+!t[o].dea;
		t[o].vid=t[t[o].l].vid+t[t[o].r].vid+!t[o].dea;
	}
	void dfs(int o)
	{
		if(!o)return;
		dfs(t[o].l);
		if(!t[o].dea)mem[idn++]=o;
		dfs(t[o].r);
		return;
	}
	int build(int l,int r)
	{
		if(l>=r) return 0;
		int mid=(l+r)>>1;
		int o=mem[mid];
		t[o].l=build(l,mid);
		t[o].r=build(mid+1,r);
		upda(o);
		return o;
	}
	inline void rebuild(int &o)
	{
		idn=0;
		dfs(o);
		o=build(0,idn);
	} 
	void insert(int &o,int val)
	{
		if(!o){o=++sum;t[o].nw(val);return;}
		t[o].siz++;t[o].vid++;
		if(val>=t[o].v) insert(t[o].r,val);
		else insert(t[o].l,val);
		if(bad(o))
		rebuild(o);
	}
	int gk(int o,int x)
	{
		int ans=1;
		while(o)
		if(t[o].v>=x) o=t[o].l;
		else ans+=t[t[o].l].vid+!t[o].dea,o=t[o].r;
		return ans;
	} 
	int kth(int o,int x)
	{
		while(o)
		{
			if(!t[o].dea&&t[t[o].l].vid+1==x) {return t[o].v;}
			if(t[t[o].l].vid>=x)o=t[o].l;
			else x-=t[t[o].l].vid+!t[o].dea,o=t[o].r; 
		}
	}
	int dete(int o,int x)
	{
		if(!t[o].dea&&t[t[o].l].vid+1==x)
		{
			t[o].dea=1;
			--t[o].vid;
			return 0;
		}
		--t[o].vid;
		if(x<=t[t[o].l].vid+!t[o].dea)dete(t[o].l,x);
		else dete(t[o].r,x-t[t[o].l].vid-!t[o].dea);
	}
}t;
inline int read()
{
	int x=0;bool f=0;char c=getchar();
	for(;!isdigit(c);c=getchar())f^=!(c^45);
	for(;isdigit(c);c=getchar()) x=(x*10)+(c^48);
	if(f)x=-x;return x;
}
int m,n,k,x,rt=0,lt=0,su=0;
int main()
{
	//freopen("P6136_1.in","r",stdin);	
	t.clear();
	m=read(),n=read();
	for(int i=1;i<=m;i++)
	{
		int x=read();
		t.insert(rt,x);
	}
	for(int i=1;i<=n;i++)
	{
		k=read();x=read();
		x=x^lt;
		if(k==1)
		{
			t.insert(rt,x); 
		} 
		if(k==2)
		{
			t.dete(rt,t.gk(rt,x)); 
		}
		if(k==3)
		{
			lt=t.gk(rt,x); su^=lt;
		}
		if(k==4)
		{
			lt=t.kth(rt,x);su^=lt;
		}
		if(k==5)
		{
			lt=t.kth(rt,t.gk(rt,x)-1);su^=lt;
		}
		if(k==6)
		{
			lt=t.kth(rt,t.gk(rt,x+1));su^=lt;
		}
	}
	printf("%d",su);
}```
本地跑能过,noilinux也能过,洛谷re
P3369相同的代码也过了。
2021/1/22 12:45
加载中...