LCT真是太抽象了,sak(%%%)给我讲了一下,大概懂了但是还有很多存在漏洞的地方。显然,先发篇博客再慢慢看吧。。。。。。。。
#include<iostream>
#include<cstdio>
using namespace std;
const int maxn=10005;
struct Link_Cut_Tree{
bool rev[maxn];
int fa[maxn],ch[maxn][2];
void push_down(int p){
if(rev[p]){
rev[ch[p][0]]^=1;
rev[ch[p][1]]^=1;
swap(ch[p][0],ch[p][1]);
rev[p]=0;
}
}
void push(int u){
if(!is_root(u))push(fa[u]);
push_down(u);
}
bool is_root(int u){
return (u!=ch[fa[u]][0])&&(u!=ch[fa[u]][1]);
}
void rotate(int u,int p,bool k){
if(!is_root(p))
ch[fa[p]][p==ch[fa[p]][1]]=u;
fa[ch[u][k^1]]=p,fa[u]=fa[p],fa[p]=u;
ch[p][k]=ch[u][k^1],ch[u][k^1]=p;
}
void splay(int u){
push(u);
while(!is_root(u))
rotate(u,fa[u],u==ch[fa[u]][1]);
}
void access(int u){
int v=0;
while(u){
splay(u);
ch[u][1]=v;
u=fa[v=u];
}
}
void set_root(int u){
access(u),splay(u);
rev[u]^=1;
}
void link(int u,int v){
set_root(u);
fa[u]=v;
}
void cut(int u,int v){
set_root(u);
access(v),splay(v);
fa[u]=ch[v][0]=0;
}
int find(int u){
while(fa[u])u=fa[u];
return u;
}
bool query(int u,int v){
return find(u)==find(v);
}
}T;
int main(){
char ch[10];
int n,m,u,v;
scanf("%d%d",&n,&m);
while(m--){
scanf("%s%d%d",ch,&u,&v);
if(ch[0]=='C')T.link(u,v);
else if(ch[0]=='D')T.cut(u,v);
else printf("%s\n",T.query(u,v)?"Yes":"No");
}
return 0;
}