题面:
题意:
给定一棵有根树,根节点是1号节点,在上面选择k个关键点。每个点的权值定义为该点与其最近关键祖先的距离(其祖先中是关键点且距离该点最近的那一个),若其祖先中没有关键点则权值为正无穷,若其本身就是关键点则权值为0。整棵树的权值定义为所有点的权值的最大值。问通过某种方法安排这k个关键点,使得这棵树的权值最小。
输出 ∑ k = 1 n v a l ( t r e e k ) \sum_{k=1}^nval(tree_k) ∑k=1nval(treek)
题解:
假设我们现在已经知道了这棵树的权值为 x,那么最少需要多少个关键点。
每次选择当前深度最深的点,将它的第 x 个祖先设为关键点,并且删除这个关键点的子树,直到整棵树被删完。这样做需要的关键点是最少的。因为每次选择的都是必须要选择的关键点。
显然,当这棵树的权值为 x 时,所需要的关键点的数量最多为 n x + 1 + 1 \frac{n}{x+1}+1 x+1n+1,因为选择一个关键点至少要删掉 x + 1 x+1 x+1 个点。
现在我们枚举这棵树的权值 x ∈ { 0 , 1 , 2 , 3 , . . . n } x\in\{0,1,2,3,...n\} x∈{ 0,1,2,3,...n},每次计算出权值为 x x x 时所需要的最少的关键点的数量 s u m [ x ] sum[x] sum[x],对于每一个关键点数量 c n t [ i ] cnt[i] cnt[i] 取一个 m i n ( x ∣ s u m [ x ] = i ) min(x|sum[x]=i) min(x∣sum[x]=i),然后再正向更新一遍 c n t [ i ] cnt[i] cnt[i],此时的 c n t cnt