bzoj 2049: [Sdoi2008]Cave 洞穴勘测
2016-03-18 22:55
246 查看
#include<cstdio> #include<iostream> using namespace std; int shu[20002][2],n,m,fa[20005],st[20005]; bool rev[20005]; bool isroot(int a1) { return shu[fa[a1]][0]!=a1&&shu[fa[a1]][1]!=a1; } void pushdown(int a1) { int l=shu[a1][0],r=shu[a1][1]; if(rev[a1]) { rev[a1]^=1; rev[l]^=1; rev[r]^=1; swap(shu[a1][0],shu[a1][1]); } } void zhuan(int a1) { int y=fa[a1],z=fa[y],l,r; if(shu[y][0]==a1) l=0; else l=1; r=l^1; if(!isroot(y)) if(shu[z][0]==y) shu[z][0]=a1; else shu[z][1]=a1; fa[a1]=z; fa[y]=a1; shu[y][l]=shu[a1][r]; fa[shu[y][l]]=y; shu[a1][r]=y; } void splay(int a1) { int top=0; top++; st[top]=a1; for(int i=a1;!isroot(i);i=fa[i]) { top++; st[top]=fa[i]; } for(int i=top;i;i--) pushdown(st[i]); for(;!isroot(a1);) { int y=fa[a1],z=fa[a1]; if(!isroot(y)) if(y==shu[z][0]^a1==shu[y][0]) zhuan(a1); else zhuan(y); zhuan(a1); } } void access(int a1) { int t=0; for(;a1;) { splay(a1); shu[a1][1]=t; t=a1; a1=fa[a1]; } } void gen(int a1) { access(a1); splay(a1); rev[a1]^=1; } void lian(int a1,int a2) { gen(a1); fa[a1]=a2; splay(a1); } void cut(int a1,int a2) { gen(a1); access(a2); splay(a2); shu[a2][0]=fa[a1]=0; } int find(int a1) { access(a1); splay(a1); int y; for(y=a1;shu[y][0];y=shu[y][0]); return y; } int main() { scanf("%d%d",&n,&m); for(int i=0;i<m;i++) { int a1,a2; char ch[10]; scanf("%s%d%d",ch,&a1,&a2); if(ch[0]=='C') lian(a1,a2); if(ch[0]=='D') cut(a1,a2); if(ch[0]=='Q') { int a3,a4; a3=find(a1); a4=find(a2); if(a3==a4) printf("Yes\n"); else printf("No\n"); } } return 0; }
link-cut-tree
相关文章推荐
- c++指针、文件读写小程序
- 学习OpenCV2——Mat之通道的理解
- 【C++】《C++标准程序库》小结八章-仿函数
- 生产者与消费者问题
- 绑定服务调用远程服务中的方法
- bzoj 2038: [2009国家集训队]小Z的袜子(hose)
- You and Your Research
- iOS各版本特性
- Android四种跨进程通信
- 【C++】知识回顾1
- 二级联动列表
- MUI-基础01
- NanoPC-T2 uboot分析(1)
- 关于openStream方法和openConnection方法的区别
- string 转 int,int 转 string
- AlphaGo 4:1 李世石
- iOS开发——Swift & Xcode
- C语言类型提升
- nsoj A. Oil Deposits
- Setting Up WS2016 Storage Spaces Direct SOFS