动态树小结
上星期只做了两天的动态树,而且光是理解动态树就花了我一天的时间。不过,理解完了以后就很好写了,写起来很愉悦,不比树链剖分难写。
参考资料
- QTREE解法的一些研究 - 杨哲
- HDU 4010. Query on The Trees - 某岛
- Lecture 7, CS 573, University of Illinois at Urbana-Champaign (Spring 06)
- Sleator, D. D.; Tarjan, R. E. (1983). “A Data Structure for Dynamic Trees”
什么是动态树 (Dynamic Tree
) 什么是 Link/cut tree
根据杨哲的论文,动态树是一类问题的总称,而解决这类问题的数据结构就是 Link/cut tree
,简称 LCT
。
根据个人理解,就是要:
- 给你一些森林,维护他们的联通性
- 在某棵树上的链(或链上节点)上做查询或修改。
很容易想到,如果没有第一点,那么第二点可以用树链剖分轻松解决。
Link/cut tree
的实现
原理我就不说了,可以参考上方的参考资料(Tarjan那篇不建议看)。主要说说实现。
大致上就是把某棵Splay
的根节点指向这棵Splay
所在实边最上方的点的父亲,也就是说,这是一条虚边。注意到这条虚边是单向的,由某棵Splay
的根指向某一节点,但是那个节点的孩子里面并没有它。LCT
的精髓就是通过这一条条的虚边将整棵大树串起来。
既然Splay
中的根节点还有父亲,为了确定哪个节点是当前Splay
的根,我们必须对正常的Splay tree
进行修改。大致有两种方法:
- 在每个节点记下
Root
标记,以确定当前节点是否为它所在的Splay tree
的根。然后旋转的时候通过标记下传修改Root标记。 - 优点:方便调试
- 缺点:
LCT
的操作写起来麻烦,而且容易出错 - 不记录
Root
标记,但是修改旋转过程。 - 优点:
LCT
非常好写好理解 - 缺点:需要修改
splay
操作
我个人还是偏向后面那种方法,后面具体说。
另外,LCT
操作的实现也有两种方法:
- 固定根,通过修改过的
Access
操作 (Access2
) 进行查询和修改。 - 动态根,通过换原树的根和原始的
Access
进行查询和修改。
很明显第一个由于少了换根,常数肯定要小的多。但是我觉得第二个理解比较容易,而且比较好写,不容易出错。
下面就介绍具体每个操作的写法。
Access(u)
这个操作是核心操作,我们保证做完之后,把u
到根的路径打通成为实边,并且u
的孩子节点的实边变成虚边。也就是这条Prefer Path
一端是根,一端是u
。
1 2 3 4 5 6 7 8 9 10 11 |
|
大致的意思就是说,每次把一个节点旋到Splay
的根,然后把上一次的Splay
的根节点当作当前根的右孩子(也就是原树中的下方)。第一次初始 v = EMPTY
是为了清除u
原来的孩子。
因为不是每次access
都需要把最后节点旋到Splay
的根,所以我就不在最后splay(v)
了。
返回值是最后访问到的节点,也就是原树的根。
MakeRoot(x)
把x
当作原树的根(因为是无向图,所以随便指定树根)。
1 2 3 4 5 |
|
打通到原根的路径,打翻转标记(交换左右子树,也就是在原树中交换上下关系),splay
清标记。
GetRoot(x)
这个操作用来得到当前Prefer Path
在原树的最上方节点,常用来判断两个节点是否在同一棵树上。
1 2 3 4 5 |
|
没什么好说的,就是旋到根,不断往左走(对应原树的往根走)。唯一要注意的是,要清除标记。
Link(x, y)
把 x
和 y
所在的子树连接起来(森林中树的连接)
1 2 3 4 5 6 |
|
最后那个access(x)
可以不用,没什么影响。
Cut(x, y)
以x
为树根,把y
到x
的路径分离出来。
1 2 3 4 5 6 7 8 9 |
|
Query(x, y)
询问x到y路径上的……以最大值为例:
1 2 3 4 5 6 |
|
Modify(x, y)
在x
到y
路径上做修改,以加上某一个值为例:
1 2 3 4 5 6 |
|
splayparent(x, y)
看x
的父亲y
是否是x
所在Splay
的父亲。
1 2 |
|
splay
过程中的终止条件就得改成这个。
例题:
后面的比较简单
[bzoj2631]tree(伍一鸣)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 |
|
[bzoj2049][Sdoi2008]Cave 洞穴勘测
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 |
|
[bzoj2594][Wc2006]水管局长数据加强版
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 |
|
[spoj2798][QTREE3]Query on a tree again!
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 |
|
[hdu4010]Query on The Trees
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 |
|
[bzoj2002][Hnoi2010]Bounce 弹飞绵羊
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 |
|