2020牛客暑期多校训练营(第四场) A、Ancient Distance(dfs序、线段树)

题目链接

题面:
在这里插入图片描述

题意:
给定一棵有根树,根节点是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(xsum[x]=i),然后再正向更新一遍 c n t [ i ] cnt[i] cnt[i],此时的 c n t cnt

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值