小五彩笔刚学LCT,样例1不过,悬赏2~8关注
查看原帖
小五彩笔刚学LCT,样例1不过,悬赏2~8关注
663638
Butterfly_qwq楼主2024/1/13 20:38
#include<bits/stdc++.h>
using namespace std;
const int N=114514;
int xum[N],w[N],ch[N][2],fa[N],lazy[N];
bool isheavy(int u)
{
	return ch[fa[u]][0]==u||ch[fa[u]][1]==u;
}
void pushup(int u)
{
	xum[u]=xum[ch[u][0]]^xum[ch[u][1]]^w[u];
}
void pushlazy(int u)
{
	if(u)
	{
		swap(ch[u][0],ch[u][1]);
		lazy[u]^=1;
	}
}
void pushdown(int u)
{
	if(lazy[u])
	{
		lazy[u]=0;
		pushlazy(ch[u][0]);
		pushlazy(ch[u][1]);
	}
}
void rotate(int u)
{
	int Fa,gfa,lr,son;
	Fa=fa[u];gfa=fa[Fa];lr=(ch[Fa][1]==u);son=ch[u][lr^1];
	if(isheavy(Fa))ch[gfa][ch[gfa][1]==Fa]=u;
	if(son)fa[son]=Fa;
	ch[u][lr^1]=Fa;
	ch[Fa][lr]=son;
	fa[Fa]=u;
	fa[u]=gfa;
}
int chain[N];
void splay(int u)
{
	int Fa=u,gfa,tot=1;
	chain[1]=u;
	while(isheavy(Fa))chain[++tot]=Fa=fa[Fa];
	while(tot)pushdown(chain[tot--]);
	while(isheavy(u))
	{
		Fa=fa[u];gfa=fa[Fa];
		if(isheavy(Fa))rotate((ch[Fa][0]==u)^(ch[gfa][0]==Fa)?u:Fa);
		rotate(u);
	}
	pushup(u);
}
void access(int u)
{
	int tmp=0;
	while(u)
	{
		splay(u);
		ch[u][1]=tmp;
		pushup(u);
		tmp=u;
		u=fa[u];
	}
}
void makeroot(int u)
{
	access(u);
	splay(u);
	pushlazy(u);
}
int findroot(int u)
{
	access(u);
	splay(u);
	while(ch[u][0])
	{
		pushdown(u);
		u=ch[u][0];
	}
	splay(u);
	return u;
}
void split(int u,int v)
{
	makeroot(u);
	access(v);
	splay(v);
}
void link(int u,int v)
{
	makeroot(u);
	if(findroot(v)!=u)fa[u]=v;
}
void cut(int u,int v)
{
	makeroot(u);
	if(findroot(v)==u&&fa[v]==u&&!ch[v][0])
	{
		fa[v]=ch[u][1]=0;
		pushup(u);
	}
}
int main()
{
	ios::sync_with_stdio(0);
	cin.tie(0);cout.tie(0);
	int n,m;
	cin>>n>>m;
	for(int i=1;i<=n;i++)cin>>w[i];
	for(int i=1,op,x,y;i<=m;i++)
	{
		cin>>op>>x>>y;
		if(op==0)
		{
			split(x,y);
			cout<<xum[y]<<'\n';
		}
		if(op==1)link(x,y);
		if(op==2)cut(x,y);
		if(op==3)
		{
			splay(x);
			w[x]=y;
			pushup(x);
		}
	}
}
2024/1/13 20:38
加载中...