解题报告—Dynamite

Dynamite

给一棵树,树上有一些关键节点,要求你选 m 个点,第 i 个关键节点到这些点中每个点距离的最小值记为 disi,记这全部 dis 的最大值为 K,现在要使 K 最小,求这个 K

n,m3×105

分析

最大的最小,套路式二分答案转判定。进而问题变为:

选出m个点,使得其与所有关键节点的距离最大不超过mid

进一步转化为:选出x个点,使得K不超过mid,最小化x。此时若xm则有解,否则无解。

来思考解决这个问题。

引理:必定存在一种最优方案,使得所选出的点最多只有一个点与所有关键节点的距离的最大值小于mid。 也即最少有x1个点满足该点到所有关键节点的距离的最大值等于mid

证明:考虑将x1个点中任意一个点随意移动一个位置,容易发现不移动一定比移动后差,由决策包容性可知引理成立。感性理解即为我们把关键节点中选出一些,与我们选出的点形成对应。也可以理解为尽量把选出点向上移动,最终结果一定不会差。

这就启发我们设fx表示xx的子树中未解决的(也即不存在已经选择的节点中与其距离小于等于mid的节点)关键节点的最大距离。

则有fx=maxySon(x){fy}+1

这时候我们还要考虑其他子树中选择的节点是否可以解决掉这个点(这个点解决了其他都解决了),不妨设gx表示x的子树中所有已经选择的节点中距离x最近的节点与x的距离。

容易得到:gx=minySon(x){gy}+1

初始值:fx=,gx=,原因是不影响父节点统计。

此时进行判断:

  1. fx+gxmid,说明所有的问题节点可以被覆盖,此时不存在待解决的关键节点,令fx=
  2. fx=mid,此时x是必须选择的节点,令fx=,gx=0即可。
  3. gx>midanddx=1。此时说明这个点在本子树内无法解决,扔给父亲。(注意如果是根节点就选自己即可)。

特判根节点

posted @   spdarkle  阅读(21)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 单线程的Redis速度为什么快?
· SQL Server 2025 AI相关能力初探
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 展开说说关于C#中ORM框架的用法!
点击右上角即可分享
微信分享提示