当前位置: 代码迷 >> 综合 >> 『二分答案·贪心·树形DP』[POI2011]DYN-Dynamite
  详细解决方案

『二分答案·贪心·树形DP』[POI2011]DYN-Dynamite

热度:93   发布时间:2023-12-17 10:59:09.0

P r o b l e m \mathrm{Problem} Problem

给一棵树,书上有一些关键节点,要求你选m个点,使得关键节点到这些点中距离的最小值的最大值最小,求这个值

S o l u t i o n \mathrm{Solution} Solution

这道题二分显然,显然之后就没有然后了。

我们采用自底向上的类似于树形DP的思想考虑这个问题,那么根据二分答案的套路我们就可以转化成:所有关键点到选中的关键点的路径在小于等于 m i d mid mid的情况,我们需要选择的最少的关键点。

这里用覆盖来表示存在这个点到某一个关键的路径小于等于 m i d mid mid

由于我们贪心的让每一个关键带覆盖更多的点,这样我们可以考虑维护一个 f 1 [ x ] f_1[x] f1?[x] f 2 [ x ] f_2[x] f2?[x].这么做的目的书,如果自底向上的去考虑问题,肯定让当前点的子树中,最近的覆盖点向上延续,这样一定可以覆盖到更多的点;如果要保证覆盖到所有的点,我们我们只要覆盖完那么最远的点即可,因为最远的点覆盖了其余的点肯定也覆盖了。

  • f 1 [ x ] f_1[x] f1?[x]表示以 x x x为子树的根节点中,最远的没有被覆盖的节点 x x x的距离
    f 1 [ x ] = max ? ( f 1 [ y ] ) + 1 f_1[x]=\max (f_1[y])+1 f