您的位置:首页 > 其它

LCT裸题-[BZOJ2049][Sdoi2008]Cave 洞穴勘测

2017-04-03 20:24 363 查看
我还是太naive了,splay循环的时候把更新f和g写到外面赋初值去了,然后就果不其然的T了。

PS:我曾一度迷信科学,直到长者出现。

两组样例,第一组是没问题的,第二组的空格是假的!是假的~假的~的。

#include<stdio.h>
#include<stdlib.h>
bool lz[10010];
int ch[10010][2],dl[10010],fa[10010];
void swap(int &x,int &y){
int z=x;
x=y;y=z;
}
bool isroot(int d){
if(d==0)return 1;
int f=fa[d];
return (ch[f][0]!=d && ch[f][1]!=d);
}
void push(int d){
if(lz[d]){
lz[d]=0;
lz[ch[d][0]]^=1;
lz[ch[d][1]]^=1;
swap(ch[d][0],ch[d][1]);
}
}
void xz(int d){
int f=fa[d],g=fa[f],c=(d==ch[f][1]);
fa[d]=g;
if(!isroot(f))
ch[g][f==ch[g][1]]=d;
fa[f]=d;
ch[f][c]=ch[d][c^1];
fa[ch[d][c^1]]=f;
ch[d][c^1]=f;
}
void splay(int d){

int u=d,top=0;
while(!isroot(u)){
dl[++top]=u;
u=fa[u];
}
dl[++top]=u;
while(top)
push(dl[top--]);
int f,g;
while(!isroot(d)){
f=fa[d],g=fa[f];
if(!isroot(f) && (f==ch[g][1])==(d==ch[f][1]))
xz(f);
xz(d);
}
}
void access(int d){
int v=0;
while(d){
splay(d);
ch[d][1]=v;
v=d;d=fa[d];
}
}
void makeroot(int d){
access(d),splay(d),lz[d]^=1;
}
void link(int u,int v){
makeroot(u),fa[u]=v;
}
void cut(int u,int v){
makeroot(u);
access(v);
splay(v);
fa[ch[v][0]]=0;
ch[v][0]=0;
}
/*
bool query(int u,int v){
makeroot(u);
access(v),splay(v);
while(ch[v][0])
v=ch[v][0];
return v==u;
}
*/
int find(int d){
while(fa[d])
d=fa[d];
return d;
}
bool query(int u,int v){
return (find(u)==find(v));
}
int main(){
int i,j,n,m,u,v;
char c[10];
scanf("%d%d",&n,&m);
for(i=1;i<=m;i++){
scanf("%s",c);
scanf("%d%d",&u,&v);
if(c[0]=='Q'){
if(query(u,v))
printf("Yes\n");
else
printf("No\n");
}
else if(c[0]=='C')
link(u,v);
else
cut(u,v);
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  LCT