cf860e-solution

CF860E Solution

link

\(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)\)

posted @ 2024-02-27 20:20  iorit  阅读(7)  评论(0)    收藏  举报