P8314 Parkovi 题解

题意:树,边有边权,求一种选出 \(k\) 个点染色的方案,使得每个点到最近的一个被染色点的距离的最大值最小,\(n\le2\cdot10^5\).

Solution

先看部分分:

  • \(n\le 20\):直接 \(C_n^k\) 爆搜.
  • \(k=1\):对每个点 \(u\) 求出 \(f(u)\)\(g(u)\) 分别表示 \(u\) 到子树内点距离的最大值、\(u\) 到子树外点距离的最大值. 这是可以转移的:\(f(u)\) 从儿子转移而来,\(g(u)\) 从父亲的 \(g\) 和兄弟的 \(f+w(v,fa(v))\) 的前后缀最大值得到.
  • 链:二分答案,发现 check 直接贪心地染色即可.

我们从链的部分分类似地推广,考虑树能不能贪心地染色. 感受一下,发现其实是可以的!策略大概是我们想要染色点尽量靠上。

具体地说,我们二分 \(x\) 表示最大距离为 \(x\),定义 \(u\) 被已经染色的 \(v\) “覆盖”当且仅当它们距离 \(\le x\),问题变成了选最少的点染色使得整棵树被覆盖.

考虑自底向上地贪心染色,每次想要一棵子树被覆盖. 记 \(mx(u)\)\(u\) 子树内未被覆盖的点与 \(u\) 距离的最大值,\(u\) 必须染色的条件大概就是 \(mx(u)\le x\)\(mx(u)+w(u,fa(u))>x\),现在问题变成了维护 \(mx(u)\).

\(mx(u)\) 可以从儿子得到,于是一个简单的想法是 \(mx(u)=\max_{v\in son(u)}\{mx(v)+w(u,v)\}\). 但是有个 bug:可能 \(u\) 子树中的点被 \(u\) 兄弟子树中的染色点所覆盖!

发现这也是好修的:再记 \(mn(u)\)\(u\) 子树内距离 \(u\) 最近的染色点的距离,显然 \(mn\) 可以转移,而 \(mx\) 再加个关于 \(mn\) 的条件就行了.


上面是思路,下面是具体式子与细节:

\[ mx(u)=\max_{v\in son(u)\land mn(u)+w(u,v)+mx(v)>x}\{ mx(v)+w(u,v) \}\\ mn(u)=\min_{v\in son(u)}\{ mn(v)+w(u,v) \} \]

\(u\) 被染色的条件:\(mx(u)+w(u,fa(u))>x\)

\(u\) 被染色时,\(mx(u)=-\inf,mn(u)=0\)

注意初始 \(mx=-\inf,mn=\inf\)

特判:根的 \(mx\) 不为 \(-\inf\) 时必须得染色.

最后输出答案时,若点数不足 \(k\),就再随便乱选几个点凑足 \(k\) 即可.

时间:\(O(n\log V)\)\(V\) 为值域(1e9)

posted @ 2024-07-29 21:30  Laijinyi  阅读(4)  评论(0编辑  收藏  举报