题目链接
做法
$$
dep(x) + dep(y) - dep(LCA(x, y)) - dep’(LCA’(x, y))\\
= \frac{1}{2} (dep(x) + dep(y) - 2dep(LCA(x, y)) + dep(x) + dep(y) - 2dep’(LCA’(x, y)))\\
= \frac{1}{2}(dis(x, y) + dep(x) + dep(y) - 2dep’(LCA’(x, y)))
$$
考虑对第一棵树边分治。设当前分治重心为 $ U, V $ ,选择 $ U $ 侧节点 $ X $ ,选择 $ V $ 侧节点 $ Y $ ,则令 $ X $ 为一类节点,贡献为 $ e1(X) = dep(X) + dis(V, X) $ ;令 $ Y $ 为二类节点,贡献为 $ e2(Y) = dep(Y) + dis(V, Y) $ 。枚举第二颗树的 $ LCA $ ,设 $ X, Y $ 在第二颗树中的 $ LCA $ 为 $ lca $ ,则对答案的贡献为 $ \frac{1}{2}(e1(X) + e2(Y) - 2dep(lca)) $ 。由于需要正确的时间复杂度,所以需要对第二颗树建虚树进行 $ DP $ 。
不优秀的实现会导致时间复杂度为 $ O(n \log^2 n) $ ,由于每次建虚树的时间复杂度应为 $ O(k) $ ,所以需要用 $ RMQ $ 实现 $ O(1) $ 的 $ LCA $ ;另外每次建虚树需要将点排序,将排序放在分治之前,然后按照分治将数列分成两段,每次建虚树直接调用数组(或者先分治下去再归并排序然后建虚树)。更改后时间复杂度为 $ O(n \log n) $ 。
注意 $ x $ 可以与 $ y $ 相同,而边分治未考虑这一点,所以还要考虑 $ x = y $ 的情况。
1 |
|