题目链接
做法
原问题实则为动态求带权重心问题。设每个点的花费为 $ W_i $ , 从任意非带权重心一点出发,每次向相邻的点中 $ W_v $ 最小的走,最后会走到带权重心。
如果已知 $ W_u $ ,求 $ u $ 的子节点 $ v $ 的 $ W_v $ 。设 $ len(u, v) $ 为 $ u, v $ 间的距离, $ cnt_u $ 为 $ u $ 子树内的军队单位数,则 $ W_v = W_u + len(u, v)(cnt_u - cnt_v \times 2) $ 。
考虑用点分治加速计算 $ W_u $ 并加速求解。每次向点分树子节点中存在比当前分治重心更优秀的点的子树跳,跳的过程复杂度 $ O(q \log n) $ 。
每次每个节点求 $ W_u $ 时间为 $ O(\log n) $ ,总时间复杂度为 $ O(n \log n + q \log^2 n) $ 。
1 |
|