Dynamite
给一棵树,树上有一些关键节点,要求你选 \(m\) 个点,第 \(i\) 个关键节点到这些点中每个点距离的最小值记为 \(dis_i\),记这全部 \(dis\) 的最大值为 \(K\),现在要使 \(K\) 最小,求这个 \(K\)。
\(n,m\le 3\times 10^5\)
分析
最大的最小,套路式二分答案转判定。进而问题变为:
选出\(m\)个点,使得其与所有关键节点的距离最大不超过\(mid\)。
进一步转化为:选出\(x\)个点,使得\(K\)不超过\(mid\),最小化\(x\)。此时若\(x\le m\)则有解,否则无解。
来思考解决这个问题。
引理:必定存在一种最优方案,使得所选出的点最多只有一个点与所有关键节点的距离的最大值小于\(mid\)。 也即最少有\(x-1\)个点满足该点到所有关键节点的距离的最大值等于\(mid\)。
证明:考虑将\(x-1\)个点中任意一个点随意移动一个位置,容易发现不移动一定比移动后差,由决策包容性可知引理成立。感性理解即为我们把关键节点中选出一些,与我们选出的点形成对应。也可以理解为尽量把选出点向上移动,最终结果一定不会差。
这就启发我们设\(f_x\)表示\(x\)与\(x\)的子树中未解决的(也即不存在已经选择的节点中与其距离小于等于\(mid\)的节点)关键节点的最大距离。
则有\(f_x=\max_{y\in Son(x)}\lbrace f_y\rbrace+1\)。
这时候我们还要考虑其他子树中选择的节点是否可以解决掉这个点(这个点解决了其他都解决了),不妨设\(g_x\)表示\(x\)的子树中所有已经选择的节点中距离\(x\)最近的节点与\(x\)的距离。
容易得到:\(g_x=\min_{y\in Son(x)}\lbrace g_y\rbrace+1\)。
初始值:\(f_x=-\infty,g_x=\infty\),原因是不影响父节点统计。
此时进行判断:
- \(f_x+g_x\le mid\),说明所有的问题节点可以被覆盖,此时不存在待解决的关键节点,令\(f_x=-\infty\)
- \(f_x=mid\),此时\(x\)是必须选择的节点,令\(f_x=-\infty,g_x=0\)即可。
- \(g_x>mid \operatorname{and} d_x=1\)。此时说明这个点在本子树内无法解决,扔给父亲。(注意如果是根节点就选自己即可)。
特判根节点
标签:infty,选出,个点,报告,mid,解题,关键,Dynamite,节点 From: https://www.cnblogs.com/oierpyt/p/17015619.html