P2147 [SDOI2008] 洞穴勘测(LCT)
P2147 [SDOI2008] 洞穴勘测(LCT)
本文搬运自本人高中时期CSDN博客,若图片加载不出来,可到原文查看:https://blog.csdn.net/zhangtingxiqwq/article/details/141825874
https://www.luogu.com.cn/problem/P2147
第一次学LCT,梳理一下。
LCT是基于splay的,所以Splay的两个基本函数都有:
-
Rotate:不同点在于如果 的父亲是 ,需要判断是否在同一棵平衡树树里在连实边。但是 的父亲一定为
-
Splay:注意,要在对 到当前平衡树根的路径倒序pushdown
1 | void Rotate(int x) { |
其中LCT引入一些新函数:
- access:把 到根的路径弄成一棵平衡树。具体操作为每次先转到当前平衡树的根,然后把父亲转到根后的右儿子设置为自己。
1 | void access(int x) { |
其他一些函数:
-
makeRoot
先access,在splay,然后对整棵平衡树翻转(遍历全变),打tag -
isRoot
父亲的左右儿子都不是自己 -
Link
先把 转到自己那棵树的根(makeRoot),然后令 -
Cut
先makeRoot(x),再access(y),现在平衡树里理论上只有两个点。然后先splay(y),在设置 ls(y) = fa(x) = 0( 我们access(y)后 一定成父子关系(但关系未定) )
1 | void makeRoot(int x) { |
需要push_down的地方:Splay和要在路径上走的时候
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来源 zhangxixi的博客!



