BZOJ2049 SDOI2008 洞穴勘测 cave
本题是一个动态树的模板题、
link-cut-tree的论文可以百度文库中找、
Code:
#include <iostream> #include <cstdio> #include <cstdlib> #include <algorithm> #include <cmath> #include <cstring> #include <vector> #include <set> #include <map> #include <queue> #define ps system("pause") #define message printf("*\n") #define pb push_back #define X first #define Y second #define PII pair<int,int> #define rep(a,b,c) for(int a=b;a<=c;a++) #define per(a,b,c) for(int a=b;a>=c;a++) typedef long long ll; using namespace std; struct node{ int son[2],fa,pf; bool isrev; }tr[500010]; int n,m,x,y; char cmd[20]; void update(int x){ if (tr[x].isrev && x){ tr[x].isrev=0; tr[tr[x].son[0]].isrev=!tr[tr[x].son[0]].isrev; tr[tr[x].son[1]].isrev=!tr[tr[x].son[1]].isrev; swap(tr[x].son[0],tr[x].son[1]); } } void zig(int now){ int F=tr[now].fa; tr[now].pf=tr[F].pf;tr[F].pf=0; tr[F].son[1]=tr[now].son[0]; if (tr[now].son[0]) tr[tr[now].son[0]].fa=F; tr[now].fa=tr[F].fa; if (tr[F].fa) if (tr[tr[F].fa].son[0]==F) tr[tr[F].fa].son[0]=now; else tr[tr[F].fa].son[1]=now; tr[F].fa=now; tr[now].son[0]=F; } void zag(int now){ int F=tr[now].fa; tr[now].pf=tr[F].pf;tr[F].pf=0; tr[F].son[0]=tr[now].son[1]; if (tr[now].son[1]) tr[tr[now].son[1]].fa=F; tr[now].fa=tr[F].fa; if (tr[F].fa) if (tr[tr[F].fa].son[0]==F) tr[tr[F].fa].son[0]=now; else tr[tr[F].fa].son[1]=now; tr[F].fa=now; tr[now].son[1]=F; } void splay(int now){ if (!now) return ; while (tr[now].fa){ update(tr[now].fa); update(tr[tr[now].fa].son[0]); update(tr[tr[now].fa].son[1]); if (tr[tr[now].fa].son[0]==now) zag(now);else zig(now); } } void access(int x){ splay(x);update(x); tr[tr[x].son[1]].pf=x; tr[tr[x].son[1]].fa=0; tr[x].son[1]=0; for (int u=tr[x].pf;u;u=tr[x].pf){ splay(u);update(u); tr[tr[u].son[1]].fa=0; tr[tr[u].son[1]].pf=u; tr[u].son[1]=x; tr[x].fa=u; tr[x].pf=0; x=u; } splay(x); } int findroot(int x){ access(x);splay(x);update(x); while (tr[x].son[0]) x=tr[x].son[0]; return x; } void reverse(int x){ access(x);splay(x); tr[x].isrev=!tr[x].isrev; update(x); } void makenew(int x){ tr[x].fa=tr[x].pf=tr[x].son[0]=tr[x].son[1]=tr[x].isrev=0; } int main(){ //freopen("cave.in","r",stdin); scanf("%d%d\n",&n,&m); rep(i,1,n) makenew(i); rep(i,1,m){ scanf("%s %d %d\n",cmd,&x,&y); //cout <<i <<":" <<cmd <<endl; switch (cmd[0]){ case 'C': reverse(x);splay(x);update(x); access(y);splay(y);update(y); tr[x].son[0]=y;tr[y].fa=x; break; case 'D': reverse(x); access(y);splay(y);update(y); tr[tr[y].son[0]].fa=0;tr[y].son[0]=0; break; case 'Q': if (findroot(x)==findroot(y)) puts("Yes"); else puts("No"); break; } } }