题意:树,边有边权,求一种选出 \(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\)
特判:根的 \(mn\) 不为 \(\inf\) 时必须得染色.
最后输出答案时,若点数不足 \(k\),就再随便乱选几个点凑足 \(k\) 即可.
时间:\(O(n\log V)\),\(V\) 为值域(1e9)
标签:Parkovi,P8314,题解,最大值,mn,距离,染色,inf,mx From: https://www.cnblogs.com/laijinyi/p/18331129