“线段树的节点摘要也是树增强思想,但索引骨架固定,不是按键旋转的搜索树。重链分解把树路径拆成若干数组区间后调用线段树;持久化数据结构则通过路径复制保留历史根。”
分解不变量 ​
根树中令
若
路径查询 ​
查询
非交换例子 ​
路径上拼接字符串或矩阵乘积时,
失效边界 ​
HLD 是静态树分解;link/cut 改变子树大小后重儿子选择可能全局失效,应使用动态森林结构。重链条数本身可很多,受控的是一条根叶路径穿过的轻边数。链上 segment tree 的 lazy 标记、边权映射到较深端点及 LCA 端点是否计入都要统一。
构建与更新语义 ​
第一次 DFS 计算 parent、depth、size 和 heavy child;第二次从每个链顶沿重儿子连续编号,再递归轻儿子开新链。两遍都是
若值放在边上,常把边
路径拆解的执行顺序 ​
查询
- 若链头相同,最后处理同一重链上的一个连续区间;
- 否则取链头更深的一侧,把该链头到当前点的区间交给底层结构;
- 把当前点跳到链头父亲,继续比较;
- 合并各段答案,并按路径方向处理非交换运算。
每次跨过轻边,剩余子树大小至少翻倍,因此每侧最多跳
边权常存到“较深端点”的数组位置。于是查询最后一段时要排除 LCA 对应位置,节点权则要保留;若不先固定这一映射,同一套区间端点会把 LCA 上方的一条边误算进来。
参考资料
- Daniel Sleator, Robert Tarjan, A Data Structure for Dynamic Trees, JCSS, 1983.
- Robert Tarjan, Data Structures and Network Algorithms, tree path decomposition.