求助LCT,为什么把link里的一个东西注释掉就错了
查看原帖
求助LCT,为什么把link里的一个东西注释掉就错了
107154
daduoli楼主2022/8/18 07:09
#include<bits/stdc++.h>
#define int long long
using namespace std;
int n,m;
struct daduoli {
	int s[2],z,sum,subval,f;
	bool tag;
}tree[200010];
bool isroot(int x) {
	int fa=tree[x].f;
	if(fa==0||(tree[fa].s[0]!=x&&tree[fa].s[1]!=x))return true;
	return false;
}
void push_up(int x) {
	tree[x].sum=1+tree[tree[x].s[0]].sum+tree[tree[x].s[1]].sum+tree[x].subval;
}
void connect(int u,int v,int d) {
	if(u)tree[u].s[d]=v;
	if(v)tree[v].f=u;
}
void rot(int x) {
	int y=tree[x].f,z=tree[y].f,d=(tree[y].s[0]!=x);
	if(isroot(y))tree[x].f=tree[y].f;
	else connect(z,x,(tree[z].s[0]!=y));
	connect(y,tree[x].s[d^1],d);
	connect(x,y,d^1);
	push_up(y);
}
void push_down(int x) {
	if(tree[x].tag==1) {
		int lson=tree[x].s[0],rson=tree[x].s[1];
		tree[lson].tag^=1;tree[rson].tag^=1;
		swap(tree[lson].s[0],tree[lson].s[1]);
		swap(tree[rson].s[0],tree[rson].s[1]);
		tree[x].tag=0;
	}
}
void dfs(int x) {
	if(!isroot(x))dfs(tree[x].f);
	push_down(x);
}
void splay(int x) {
	dfs(x);
	while(!isroot(x)) {
		int y=tree[x].f,z=tree[y].f;
		if(!isroot(y)) {
			if((tree[y].s[0]==x)^(tree[z].s[0]==y)==0)rot(y);
			else rot(x);
		}
		rot(x);
	}
	push_up(x);
}

void access(int u) {
	int pre=0;
	while(u) {
		splay(u);
		if(tree[u].s[1])tree[u].subval+=tree[tree[u].s[1]].sum;
		if(pre)tree[u].subval-=tree[pre].sum;
		tree[u].s[1]=pre;
		push_up(u);
		pre=u;
		u=tree[u].f;
	}
}
void evert(int u) {
	access(u);splay(u);
	tree[u].tag^=1;
	swap(tree[u].s[0],tree[u].s[1]);
	push_up(u);
}
int findrt(int node) {
	access(node);splay(node);
	push_down(node);
	while(tree[node].s[0]) {
		node=tree[node].s[0];
		push_down(node);
	}
	return node;
}
void link(int u,int v) {
//	if(findrt(u)==findrt(v))return ;
	evert(u);
	tree[u].f=v;
	tree[v].subval+=tree[u].sum;
	push_up(v);
}
void cut(int u,int v) {
	evert(v);access(u);splay(u);
	if(tree[u].s[0]==v&&tree[v].s[1]==0) {
		tree[u].s[0]=0;
		tree[v].f=0;
		push_up(u);
	}
}
int query(int u,int v) {
	if(findrt(u)!=findrt(v))return -1;
	evert(v);
	access(u);
	splay(u);
	return (tree[v].subval+1)*(tree[u].subval+1);
}
signed main(){
	cin>>n>>m;
	char opt;
	int x,y;
	for(int i=1;i<=n;++i)tree[i].sum=1;
	for(int i=1;i<=m;++i) {
		cin>>opt;
		scanf("%lld%lld",&x,&y);
		if(opt=='A')link(x,y);
		if(opt=='Q')printf("%lld\n",query(x,y));
	}
	
	return 0;
}
2022/8/18 07:09
加载中...