题解 CF1436D Bandit in a City

给定以 \(1\) 为根的 \(n\) 个节点的一棵树,每个节点上有 \(a_i\) 个人,每个人可以选择往任意子节点走,直到走到叶子节点为止,问最后人最多的叶子节点最少有多少人。

最少的最多嘛!那就二分!很容易想到验证的方法,因为一个点可以到下面任意一个叶子,所以记录一下下面叶子最多能容纳的和就可以了。

然后收获了 Wrong answer on test 5。

注意到这样验证有一个大问题,每个点最多可能容纳 \(2 \times 10^{14}\) 个人,而在二分时我们把这些“可能”都加起来的时候就有 \(2 \times 10^{19}\),连 ull(约 \(1.844674407\times 10^{19}\))都给爆了。

众所周知,CF 的出题人是不会来恶心人的, 得采用别的方法做。

这里可以用树形 dp,\(f_u\) 表示以 \(u\) 为根的子树的答案,\(f_u = \max\{\max f_v, \lceil\frac{w}{num}\rceil\}\) ,即儿子的最大值和平均分配子树取 \(\max\)。这样是对的因为如果下面的超过了平均值意味着其它的方向可以容纳下这些,不然平均值肯定更大,而没有超过平均值的时候自然可以把这些放到其它地方。

警告!

仔细考虑数据范围!

posted @ 2021-08-10 11:24  Acfboy  阅读(17)  评论(0编辑  收藏  举报