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