本文目录#
问题背景#
在树上需要频繁查询与更新路径或子树信息时,常用重链剖分 (Heavy-Light Decomposition, HLD) 将树转化为若干线段树/树状数组处理的链。
基本步骤#
- 第一次 DFS:计算每个节点子树大小、父节点、重儿子。
- 第二次 DFS:为每个节点分配链顶与 dfs 序,重儿子继续当前链,其他儿子开启新链。
- 线段树/树状数组:在 dfs 序上构建数据结构,实现区间更新/查询。
1 | class HLD { |
应用场景#
- 路径求和/最大值;
- 支持区间更新(配合懒标记线段树);
- 与差分结合处理边权问题。
自检清单#
- 是否正确选择重儿子并维护 dfs 序?
- 是否注意边权 vs 点权的差异?
- 是否优化数据结构以支持所需操作?
参考资料#
- CP-Algorithms Heavy-Light Decomposition:https://cp-algorithms.com/graph/hld.html
- MIT OCW 6.851 Advanced Data Structures(树分解章节)
- 《Competitive Programming 3》相关章节
本作品系原创,采用知识共享署名-非商业性使用-禁止演绎 4.0 国际许可协议进行许可,转载请注明出处。