社区讨论

50行LCT模板

P3690【模板】动态树(LCT)参与者 11已保存回复 15

讨论操作

快速查看讨论及其快照的属性,并进行相关操作。

当前回复
15 条
当前快照
1 份
快照标识符
@mi7x7d26
此快照首次捕获于
2025/11/21 05:05
4 个月前
此快照最后确认于
2025/11/21 06:37
4 个月前
查看原帖
RTRT
我刚刚用了20min写+调。
考场肯定能轻松写出来QAQ
CPP
#include<bits/stdc++.h>
using namespace std;
#define ll long long
#define gt getchar()
inline int in()
{
	int k=0;char ch=gt;bool p=1;
	while(ch<'-')ch=gt;if(ch=='-')p=0,ch=gt;
	while(ch>'-')k=k*10+ch-'0',ch=gt;
	return p?k:-k;
}
const int N=3e5+5;
int ch[N][2],fa[N],sum[N],val[N],lz[N];
#define lc ch[x][0]
#define rc ch[x][1]
inline int nrt(int x){return ch[fa[x]][0]==x||ch[fa[x]][1]==x;}
inline int pd(int x){return ch[fa[x]][1]==x;}
inline void up(int x){sum[x]=val[x]^sum[lc]^sum[rc];}
inline void rever(int x){lz[x]^=1;std::swap(lc,rc);}
inline void down(int x){if(lz[x]){if(lc)rever(lc);if(rc)rever(rc);lz[x]=0;}}
inline void rot(int x)
{
	int y=fa[x],z=fa[y],d=pd(x),w=ch[x][d^1];
	if(nrt(y))ch[z][pd(y)]=x;ch[x][d^1]=y,ch[y][d]=w;
	if(w)fa[w]=y;fa[x]=z,fa[y]=x;up(y);
}
inline void splay(int x)
{
	static int y,z,st[N];y=x,z=0;st[++z]=y;
	while(nrt(y))y=fa[y],st[++z]=y;while(z)down(st[z--]);
	for(y=fa[x];nrt(x);rot(x),y=fa[x])if(nrt(y))rot((pd(y)^pd(x))?x:y);up(x);
}
inline void access(int x){for(int y=0;x;rc=y,up(x),x=fa[y=x])splay(x);}
inline void makert(int x){access(x),splay(x),rever(x);}
inline void split(int x,int y){makert(x),access(y),splay(y);}
inline int findrt(int x){access(x),splay(x),down(x);while(lc)x=lc,down(x);return splay(x),x;}
inline void link(int x,int y){makert(x);if(findrt(y)!=x)fa[x]=y,up(y);}
inline void cut(int x,int y){makert(x);if(findrt(y)==x&&fa[y]==x&&!ch[y][0])rc=fa[y]=0,up(x);}
int main()
{
	int n=in(),m=in();
	for(int i=1;i<=n;++i)sum[i]=val[i]=in();
	for(int i=1;i<=m;++i)
	{
		int op=in(),x=in(),y=in();
		if(op==0)split(x,y),printf("%d\n",sum[y]);
		if(op==1)link(x,y);
		if(op==2)cut(x,y);
		if(op==3)val[x]=y,splay(x);
	}
	return 0;
}

回复

15 条回复,欢迎继续交流。

正在加载回复...