bzoj 2049: [Sdoi]Cave 洞穴探测 (LCT)

第一次写lct

(这是一道lct裸题

这次没有可爱(划掉)的同学教我,虽然有模板,但是配合网上的讲解还是看不懂QAQ

然后做了几道题之后总算有些感觉辣

于是决定给自己挖个坑,近期写一个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 }
原文地址:https://www.cnblogs.com/cminus/p/7056221.html