我有一棵树。我想回答以下问题:
- 在路径上添加值
- 在路径上获取总和
我正在使用重光分解。n
树中有节点和m
查询。使用 HLD,当我知道Lowest Common Ancestor时,我可以将任何查询u
和v
分成两个不同的查询: from u
tolca
和 from v
to lca
。因此,查询将得到及时回答O(log^2n)
(log
从u
和v
到lca
,以及log
重路径上的分段树)。
如您所知,HLD 是按O(n)
时间构建的,因此总时间为O(n + m*log^2n)
. 我的问题是如何使用已经构建的 HLD 找到 LCA。我无法发明算法。
我可以使用二进制爬升来获得 LCA,但它需要O(nlogn)
预处理,这会使渐近行为变得更糟。我也可以使用Range Minimum Query,这不会浪费时间,但我想在这个过程中使用 HLD。谢谢你的任何想法!