cf860e-solution
CF860E Solution
\(f(x,y)\) 表示 \(y\) 的子树中比 \(x\) 深度小的有多少个,其中 \(x\) 在 \(y\) 子树中。
\(g(x)\) 表示枚举 \(x\) 的祖先 \(y\),求 \(y\) 的子树中比 \(x\) 深度小的有多少个并求和。
考虑对每个点算贡献。对于每个深度比 \(x\) 小的点 \(z\),选中的 \(y\) 能统计到 \(z\) 当且仅当 \(y\) 是 \(x,z\) 公共祖先。
那么问题变成枚举比 \(x\) 小的点 \(z\) 对 \(LCA(x,z)\) 的深度求和。
对于 \(LCA\) 的深度,容易想到把 \(x,z\) 到根的路径打上标记,同时被标记的点数就是 \(LCA\) 的深度。
对于这题,我们把点按照深度排序,对于同一层深度的点先把它们到根的路径打上标记,之后这一层每个点的答案就是它到根的标记数。
用树剖实现,复杂度 \(\mathcal O(n\log^2n)\)。

浙公网安备 33010602011771号