# bzoj 2049: [Sdoi]Cave 洞穴探测 （LCT）

（这是一道lct裸题

 1 /**************************************************************
2     Problem: 2049
3     User: cminus
4     Language: C++
5     Result: Accepted
6     Time:1532 ms
7     Memory:984 kb
8 ****************************************************************/
9
10 #include <cstdio>
11 #include <algorithm>
12 #include <stack>
13 using namespace std;
14 #define kd(x) (ch[fa[x]][1] == x)
15 #define setc(f, c, k) (ch[fa[c] = f][k] = c)
16 #define isRoot(x) (ch[fa[x]][0] != x and ch[fa[x]][1] != x)
17 #define ls ch[x][0]
18 #define rs ch[x][1]
19 const int N = 10020;
20
21 int fa[N], ch[N][2], n, m;
22 bool mark[N];
23
24 inline void push(int x){
25     if (mark[x]){
26         mark[x] = false;
27         mark[ls] ^= 1;
28         mark[rs] ^= 1;
29         swap(ls, rs);
30     }
31 }
32 stack < int > S;
33 inline void pushDown(int x) {
34     S.push(x);
35     while (!isRoot(x))
36         S.push(x = fa[x]);
37     while (!S.empty())
38         push(S.top()), S.pop();
39 }
40
41 inline void rotate (int x) {
42     int y = fa[x], k = kd(x);
43     setc(y, ch[x][k ^ 1], k);
44     if (isRoot(y)) fa[x] = fa[y];
45     else setc(fa[y], x, kd(y));
46     setc(x, y, k ^ 1);
47 }
48
49 inline void splay (int x) {
50     pushDown(x);
51     while (! isRoot(x)) {
52         if (! isRoot(fa[x]))
53             if (kd(x) == kd(fa[x])) rotate(fa[x]);
54             else rotate(x);rotate(x);
55     }
56 }
57
58 inline void access(int x) {
59     int t = 0;
60     while (x) {
61         splay(x);
62         rs = t; t = x; x = fa[x];
63     }
64 }
65
66 inline void makeRoot(int u) {
67     access(u); splay(u);
68     mark[u] ^= 1;
69 }
70
71 inline void link(int u, int v){
72     makeRoot(u); fa[u] = v;
73 }
74
75 inline void cut(int u, int v){
76     makeRoot(u);
77     access(v);  splay(v);
78     fa[u] = ch[v][0] = 0;
79 }
80
81 inline int findRoot(int x) {
82     while(fa[x])    x = fa[x];
83     return x;
84 }
85 int main(){
86     scanf("%d %d", &n, &m);
87     char str[20];
88     while(m--){
89         int u, v;
90         scanf("%s %d %d", str, &u, &v);
91         if (*str == 'C')    link(u, v);
92         else if (*str == 'D')   cut(u, v);
93         else    puts((findRoot(u) == findRoot(v)) ? "Yes" : "No");
94     }
95     return 0;
96 }

posted @ 2017-06-20 20:40  cminus  阅读(103)  评论(0编辑  收藏