|
板凳
楼主 |
发表于 2021-10-27 14:53:32
|
只看该作者
2 花花的聚会
2.1 题意简述
有一棵 n 个节点的有根树,在某些节点 vi,可以选择花费 wi 的代价,向上跳 [1, ki
] 步。
现有 q 个询问,询问一些节点跳到根的最少代价。
2.2 解法一
对于每个询问,暴力枚举所有可能的向上跳的方案,从而得到最少代价。在枚举过程中可
加入各种剪枝。
期望得分 40 分。
2.3 解法二
对于每个询问,我们可以贪心地选择向上跳的方案。并使用相关的数据结构来提升效率。
期望得分 0-100 分。
2.4 解法三
不难发现,我们可以用动态规划的思想来解决这个问题。记 f[u] 为 u 跳到根的最少代价。
则不难得出转移方程:f[u] = min{f[v] + wi},其中 v 是 u 的祖先,且存在一种车票 ui
, wi
, ki
并满足 dep[u] − dep[v] ≤ ki。这个DP方程的边界条件为 f[root] = 0。这样对于每种车票,我
们可以暴力枚举所有合法的 v,从而求得答案。
时间复杂度为 O(mn),期望得分 60-80 分。
2.5 解法四
考虑优化解法三的DP转移。事实上我们只需在较快的时间内求得树上某一段区间的
min{f[u]},即可较好地解决这个问题。而维护树上区间最值有树链剖分、动态树等许多数据
结构能够胜任。在这里我们考虑用倍增的思想,维护 u 往上跳 2
i 步到的祖先 v 和 u 到 v 这一
段 f 值的最小值,这样我们对于每一个节点 u 可以在 O(logn) 的时间内求得 min{f[v]}。
时间复杂度为 O(nlogn),期望得分 100 分。
|
|