1. 程式人生 > 其它 >題解 CF1436D Bandit in a City

題解 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\)。這樣是對的因為如果下面的超過了平均值意味著其它的方向可以容納下這些,不然平均值肯定更大,而沒有超過平均值的時候自然可以把這些放到其它地方。

警告!

仔細考慮資料範圍!