AT_arc098_d [ARC098F] Donation 题解
:::::info[题目基本信息]
考察:Kruskal 重构树,并查集,动态规划 DP(
题目简介:
给定一个
现在你的任务是在每个节点都操作一次,当你位于
数据范围:
-
1\le n\le 10^5 -
n-1\le m\le 10^5 -
\forall i\in[1,n],1\le a_i,b_i\le 10^9 ::::: 先令
a_u\leftarrow\max(a_u-b_u,0) ,限制转化为你在任一时刻位于点u 时能力值均不能低于a_u 。
你考虑u 到v 如何才能最可能走过去,设u 和v 之间的一条路径为P ,当前能力值为p ,那么充要条件就为\max_{u\in P}a_u\le p ,现在我们就是尽可能得让这个值变小。
让\max 变小我们可以考虑使用 Kruskal 重构树,但是现在是点权,所以我们考虑给所有的u 和v 连一条边,边权为\max(a_u,a_v) ,这样就可以跑最小生成树。
考虑贪心,按a_u 从小到大枚举点u ,在和它相连的比a_u 小的点v 中没连的点令其与u 连边,正确性易证。
这样我们建出了一棵最小生成树,但是通过尝试我们发现它的性质还是不够好,我们仍然无法解决这个问题。
下面就是这个题非常妙的转化,我们将上面的建树方式转化为:按
a_u 从小到大枚举点u ,在和它相连的比a_u 小的点v 中没连的点令其最高的祖先与u 连边。
虽然看起来很人类智慧,但是正确性是成立的,因为与
那么这样建树有没有什么其他性质呢?
- 性质:若以
a_i 最大的i 为根,那么对于任意u,v ,若u 是v 的祖先,那么a_u>a_v 。证明显然。
那么有了这个重要性质这个题就可做了,容易发现本题在哪里选起点都无所谓,钦定从根开始,设
其中
这样我们直接 DP 就做完了这道题。
时空复杂度均为
code