BZOJ 2049 LCT
Orz 黄学长, 当然也要感谢自己(这次打的比较顺利,虽然题目操作很少,也比较简单),加油, 相信自己, 会更强大的, 但还是要虚心, 才会有更大的进步。 不过还是有点不懂,找个时间,问一下czl吧!
1 #include<cstdio> 2 #include<iostream> 3 #include<cstring> 4 #define rep(i,j,k) for(int i = j; i <= k; i++) 5 #define lc c[k][0] 6 #define rc c[k][1] 7 #define maxn 10233 8 using namespace std; 9 10 int n, m; 11 int read() 12 { 13 int s = 0, t = 1; char c = getchar(); 14 while( !isdigit(c) ){ 15 if( c == '-' ) t = -1; c = getchar(); 16 } 17 while( isdigit(c) ){ 18 s = s * 10 + c - '0'; c = getchar(); 19 } 20 return s * t; 21 } 22 23 int c[maxn][2], pa[maxn]; 24 bool rev[maxn]; 25 int q[maxn]; 26 27 inline bool root(int x) 28 { 29 int k = pa[x]; 30 return lc != x && rc != x; 31 } 32 33 void pushdown(int k) 34 { 35 if( rev[k] ){ 36 rev[lc] ^= 1, rev[rc] ^= 1; 37 swap(lc,rc); 38 rev[k] ^= 1; 39 } 40 } 41 42 void rorate(int k) 43 { 44 int fa = pa[k], gfa = pa[fa]; 45 int l = c[fa][1] == k, r = l ^ 1; 46 if( !root(fa) ){ 47 c[gfa][c[gfa][1] == fa] = k; 48 } 49 pa[k] = gfa, pa[c[k][r]] = fa, pa[fa] = k; 50 c[fa][l] = c[k][r]; c[k][r] = fa; 51 } 52 53 void splay(int k) 54 { 55 int top = 0; 56 q[++top] = k; 57 for( int x = k; !root(x); x = pa[x] ){ 58 q[++top] = pa[x]; 59 } 60 while( top ) pushdown(q[top--]); 61 while( !root(k) ){ 62 int fa = pa[k], gfa = pa[fa]; 63 if( !root(fa) ){ 64 if( c[fa][0] == k ^ c[gfa][0] == fa ) rorate(k); 65 else rorate(fa); 66 } 67 rorate(k); 68 } 69 } 70 71 void access(int x) 72 { 73 for(int t = 0; x; t = x, x = pa[x]){ 74 splay(x), c[x][1] = t; 75 } 76 } 77 78 void makeroot(int x) 79 { 80 access(x), splay(x); rev[x] ^= 1; 81 } 82 83 void link(int x,int y) 84 { 85 makeroot(x); pa[x] = y; splay(x); 86 } 87 88 void cut(int x,int y) 89 { 90 makeroot(x); access(y), splay(y); c[y][0] = pa[x] = 0; 91 } 92 93 int find(int k) 94 { 95 access(k); splay(k); 96 while( lc ) k = lc; 97 return k; 98 } 99 100 bool solve(int x,int y) 101 { 102 if( find(x) == find(y) ) return 1; 103 else return 0; 104 } 105 106 int main() 107 { 108 n = read(), m = read(); char c[10]; 109 rep(i,1,m){ 110 scanf("%s", c); 111 int x = read(), y = read(); 112 if( c[0] == 'C' ){ 113 link(x,y); 114 } 115 if( c[0] == 'Q' ){ 116 if( solve(x,y) ) puts("Yes"); 117 else puts("No"); 118 } 119 if( c[0] == 'D' ){ 120 cut(x,y); 121 } 122 } 123 return 0; 124 }
————————————————