P7880 [Ynoi2006] rldcot
题意
给定一棵树,求区间 \([l, r]\) 中任意两点的 LCA 的不同的带权深度的个数。
Sol
很容易想到 Dsu on tree。
因为当前点 \(x\) 作为 LCA 产生贡献当且仅当有两点 \(u, v\) 分别在 \(x\) 的不同子树中。
集中注意力,不难发现对于一个 \(u\) 来说,只有子树中她在序列上的前驱后继会对她产生贡献。
考虑用一个三元组 \((a, b, dep)\) 表示一个会对答案产生贡献的答案。
注意到因为跑了 Dsu,会对答案产生贡献的三元组的级别在 \(O(n \log n)\)。
Dsu 上使用 set 维护前驱后继,复杂度 \(O(n \log ^ 2 n)\)。
现在问题变为对于三元组统计 \(l \le a, b \le r\) 的答案。
直接离线跑扫描线即可。
复杂度:\(O(n \log ^ 2 n + q \log n)\)。