博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
BZOJ3282 Tree
阅读量:5337 次
发布时间:2019-06-15

本文共 3382 字,大约阅读时间需要 11 分钟。

论什么是LCT?蒟蒻也不造。。。

splay写错是shen me gui = =

话说,要注意翻转标记!!!

还是要注意link & cut的写法啊喂!

 

1 /**************************************************************  2     Problem: 3282  3     User: rausen  4     Language: C++  5     Result: Accepted  6     Time:1732 ms  7     Memory:7840 kb  8 ****************************************************************/  9   10 #include 
11 #include
12 13 using namespace std; 14 const int N = 300005; 15 16 struct splay_node { 17 int v, res, rev; 18 int fa, son[2]; 19 } tr[N]; 20 21 int n; 22 23 inline int read() { 24 int x = 0, sgn = 1; 25 char ch = getchar(); 26 while (ch < '0' || '9' < ch) { 27 if (ch == '-') sgn = -1; 28 ch = getchar(); 29 } 30 while ('0' <= ch && ch <= '9') { 31 x = x * 10 + ch - '0'; 32 ch = getchar(); 33 } 34 return sgn * x; 35 } 36 37 #define lson tr[p].son[0] 38 #define rson tr[p].son[1] 39 #define Rev tr[p].rev 40 #define Res tr[p].res 41 #define V tr[p].v 42 #define Fa tr[p].fa 43 inline void update(int p) { 44 tr[0].res = 0; 45 Res = tr[lson].res ^ tr[rson].res ^ V; 46 } 47 48 inline void push_down(int p) { 49 if (p && Rev) { 50 swap(lson, rson); 51 tr[lson].rev ^= 1, tr[rson].rev ^= 1; 52 Rev = 0; 53 } 54 } 55 56 inline bool is_root(int p) { 57 return Fa == 0 || (tr[Fa].son[0] != p && tr[Fa].son[1] != p); 58 } 59 60 inline void rotate(int p) { 61 int fa = tr[p].fa, gr = tr[fa].fa; 62 int l = (tr[fa].son[1] == p), r = !l; 63 if (!is_root(fa)) tr[gr].son[tr[gr].son[1] == fa] = p; 64 tr[p].fa = gr, tr[fa].fa = p, tr[tr[p].son[r]].fa = fa; 65 tr[fa].son[l] = tr[p].son[r], tr[p].son[r] = fa; 66 update(fa), update(p); 67 } 68 69 void splay(int p) { 70 int fa, gr; 71 while (!is_root(p)) { 72 fa = tr[p].fa, gr = tr[fa].fa; 73 push_down(gr), push_down(fa), push_down(p); 74 if (!is_root(fa)) 75 if ((fa == tr[gr].son[0]) ^ (p == tr[fa].son[0])) rotate(p); 76 else rotate(fa); 77 rotate(p); 78 } 79 push_down(p); 80 } 81 82 83 void access(int p) { 84 int t; 85 for (t = 0; p; t = p, p = Fa) { 86 splay(p); 87 rson = t, update(p); 88 } 89 } 90 91 void make_root(int p) { 92 access(p), splay(p); 93 Rev ^= 1; 94 } 95 96 int find_root(int p) { 97 access(p), splay(p); 98 while (lson) { 99 push_down(p);100 p = lson;101 }102 return p;103 }104 105 106 void cut(int x, int y) {107 make_root(x);108 access(y), splay(y);109 if (tr[y].son[0] == x && tr[x].son[1] == 0)110 tr[y].son[0] = tr[x].fa = 0, update(y);111 }112 113 void link(int x, int y) {114 make_root(x);115 tr[x].fa = y;116 }117 118 int main() {119 int i, Q, oper, x, y;120 n = read(), Q = read();121 for (i = 1; i <= n; ++i)122 tr[i].v = tr[i].res = read();123 while (Q--) {124 oper = read(), x = read(), y = read();125 if (oper == 0) {126 make_root(x);127 access(y), splay(y);128 printf("%d\n", tr[y].res);129 } else if (oper == 1) {130 if (find_root(x) != find_root(y)) link(x, y);131 }132 else if (oper == 2) {133 if (find_root(x) == find_root(y)) cut(x, y);134 }135 else {136 access(x), splay(x);137 tr[x].v = y;138 update(x);139 }140 }141 return 0;142 }
View Code

(p.s.  不要问为什么窝改了代码风格。。。)

转载于:https://www.cnblogs.com/rausen/p/4202440.html

你可能感兴趣的文章
函数名可以作为函数的返回值
查看>>
C代码中如何调用C++ C++中如何调用C
查看>>
webx学习
查看>>
eclipse导出可供项目引用的jar
查看>>
(16)JavaScript的流程控制(js的循环)
查看>>
java之equals()和hashCode()方法
查看>>
十进制转换为二进制(一直不会算的)
查看>>
Linux源码编译安装php7.3
查看>>
CF997B Roman Digits
查看>>
CF786B Legacy
查看>>
PHP7.1安装xdebug
查看>>
HighCharts的.Net本地导出环境配置
查看>>
[bbk5398] 第96集 -第12章 -数据移植 02
查看>>
Swift 2.0 单例的用法
查看>>
C++知识点综述
查看>>
模板方法模式
查看>>
获取url参数
查看>>
python3-开发面试题(python)6.23基础篇(2)
查看>>
二叉树算法小结
查看>>
ORACLE 异常错误处理
查看>>