AT_arc098_d [ARC098F] Donation 题解

· · 题解

:::::info[题目基本信息] 考察:Kruskal 重构树,并查集,动态规划 DP(3189)。
题目简介:
给定一个 n 个点 m 条边的无向联通图,你可以在这个图上任意选起点任意游走,唯一的限制是给定序列 \{a_n\},当你在 u 点时你的能力值不得小于 a_u
现在你的任务是在每个节点都操作一次,当你位于 u 点时你可以对 u 点进行操作,操作后你的能力值会减少 b_u,当你能力值小于 0 时任务立即失败(即使你操作了最后一个点),问任务成功需要的最低初始能力值是多少。
数据范围:

虽然看起来很人类智慧,但是正确性是成立的,因为与 v 直接相连或间接相连的点 wa_w 肯定都不超过 a_u,同时这条 vw 路径上的权值肯定都不超过 a_u,所以点权 \max 是不变的,正确性成立。
那么这样建树有没有什么其他性质呢?

那么有了这个重要性质这个题就可做了,容易发现本题在哪里选起点都无所谓,钦定从根开始,设 f_u 表示以 u 为根的子树中从 u 开始操作完所有子树内的点(不必回到 u 点)的最小初始能力值。那么对于一个 u,枚举最后进入的子树的根为 v,那么遍历其它子树时由于上面所说性质,我们只需保证最后一次回到 u 时的能力值不低于 a_u 即可,容易得到状态转移方程:

f_u=\min_{v\in\text{son}_u}(siz_u-siz_v+\max(a_u,f_v))

其中 siz_u 表示子树 u 内的 b_i 总和,\text{son}_u 表示 u 的儿子集合,特别地,对于叶子结点 u,满足 f_u=a_u+b_u
这样我们直接 DP 就做完了这道题。
时空复杂度均为 \Theta(n+m)

code