Loading

浅谈LCT

弹道导弹?(LCT)入门

自己看,我认为 WC2022 讲得挺好的。

我的板子

算是短的了,跑的有点小慢。

#include<bits/stdc++.h>
using namespace std;
template <class T>
inline T read(){
	T r=0,f=0;char c=getchar();
	while(!isdigit(c)) f|=c=='-',c=getchar();
	while(isdigit(c)) r=(r<<3)+(r<<1)+(c^48),c=getchar();
	return f?-r:r;
}
const int N=1e5+5;
int n,m;
int val[N],sum[N],ch[N][2],fa[N],lazy[N],stk[N],top;
void pushdown(int x){if(lazy[x]) lazy[ch[x][0]]^=1,lazy[ch[x][1]]^=1,swap(ch[x][0],ch[x][1]),lazy[x]=0;}
void pushup(int x){sum[x]=sum[ch[x][0]]^val[x]^sum[ch[x][1]];}
bool isroot(int x){return ch[fa[x]][0]!=x&&ch[fa[x]][1]!=x;}
bool ident(int x){return ch[fa[x]][1]==x;}
void rotate(int x){
	int y=fa[x],z=fa[y];bool k=ident(x);
	fa[x]=z; if(!isroot(y)) ch[z][ident(y)]=x;
	if(ch[x][!k]) fa[ch[x][!k]]=y; ch[y][k]=ch[x][!k];
	ch[x][!k]=y,fa[y]=x;
	pushup(y),pushup(x);
}
void splay(int x){
	stk[top=1]=x;
	for(int i=x;!isroot(i);i=fa[i]) stk[++top]=fa[i]; while(top) pushdown(stk[top--]);
	for(int y,z;y=fa[x],z=fa[y],!isroot(x);rotate(x)) if(!isroot(y)) ident(y)^ident(z)?rotate(x):rotate(y);
}
void access(int x){for(int lst=0;x;lst=x,x=fa[x]) splay(x),ch[x][1]=lst,pushup(x);}
void makeroot(int x){access(x),splay(x),lazy[x]^=1;}
int findroot(int x){access(x),splay(x),pushdown(x); while(ch[x][0]) x=ch[x][0],pushdown(x);	return splay(x),x;}
void link(int x,int y){makeroot(x); if(findroot(y)^x) fa[x]=y;}
void cut(int x,int y){makeroot(x); if(findroot(y)==x&&fa[y]==x&&!ch[y][0]) ch[x][1]=fa[y]=0,pushup(x);}
//void split(int x,int y){makeroot(x),access(y);}
int main(){
	n=read<int>(),m=read<int>();
	for(int i=1;i<=n;++i) val[i]=sum[i]=read<int>();
	while(m--){
		int opt=read<int>(),x=read<int>(),y=read<int>();
		switch(opt){
			case 0: makeroot(x),access(y),splay(y),printf("%d\n",sum[y]); break;
			case 1: link(x,y); break;
			case 2: cut(x,y); break;
			case 3: makeroot(x),val[x]=y,pushup(x); break;
		}
	}
	return 0;
}

一些题

暂无

posted @ 2022-02-06 21:23  Quick_Kk  阅读(77)  评论(1编辑  收藏  举报