1 条题解
-
0
题目大意
给定一棵 个节点的树,每个节点 有两个值:
- 疲劳值 (节点被覆盖一次就要累加一次 )
- 高度
每条边 如果 ,则方向已经确定(从低到高,因为挑战要求非降高度)。
如果 ,则方向未定,需要我们决定。我们要用若干条挑战(即节点序列,相邻节点有边,且高度非降)覆盖所有边,每条边恰好属于一个挑战。
一个节点可以被多个挑战经过。
一个挑战的疲劳值是其所有节点的 之和。
目标:最小化所有挑战的疲劳值总和。
转化与观察
- 一条挑战对应一条有向路径(按高度非降方向)。
- 若 ,边 方向固定( 小 → 大)。
- 若 ,边方向未定。
第一步:若所有边方向已定
假设我们已经给每条边定向(满足 不降方向)。
初始方案:每条边 作为一条长度为 的挑战()。
总疲劳值 = ,其中 是 在原树中的度数(因为每个节点出现在每条邻边上一次)。合并挑战减少疲劳
如果存在两条挑战 和 ,且 在 上(即 可拼接),可以合并成 。
合并后 的疲劳值 少算一次(原来在两个挑战中各出现一次,现在只出现一次)。
所以减少量 = 。
关键观察
对于节点 ,设:
- = 以 为终点的挑战数
- = 以 为起点的挑战数
初始时(每条边单独成挑战):
- = 指向 的边数
- = 从 出发的边数
合并操作相当于选择某个节点 ,将其一个入边挑战和一个出边挑战合并, 和 各减少 , 的总疲劳减少 。
每个节点最多可合并 次(因为每次减少一对入/出)。
因此最大总减少量 = 。最终最小总疲劳 = 初始总疲劳 − 最大总减少。
第二步:原问题(部分边方向未定)
- 对 的边,方向固定,统计 和 。
- 对 的边,方向未定,形成若干连通块(每个连通块内所有边 相等)。
在这些未定向的连通块上做树形 DP。
DP 定义
对每个连通块任选根。设 是 的父亲。
- :边 方向为 时, 的子树内最大减少量。
- :边 方向为 时, 的子树内最大减少量。
转移
考虑节点 ,它有 个子节点 。
对于每个子节点 :
- 如果边 定向为 ,则贡献 ( 的子树已算好,且 指向 )。
- 如果定向为 ,则贡献 。
设 = 从子节点指向 的边数(即选择 个 取 ,其余取 )。
那么 的总减少量中,来自 本身的贡献为:
$$\min(in'_u + x + [p_u \to u], \; out'_u + (c - x) + [u \to p_u]) \cdot t_u $$其中 表示父亲边方向是否增加 , 同理。
我们要最大化:
对于每个可能的 。
排序优化
对子节点按 降序排序。
令 = 前 个的 之和。
则当 时,最大值 = 。这样对每个 可以 得到最大值。
根节点处理
对于根 ,没有父亲边。
其 表示子节点指向 的个数。
贡献为:加上子节点的贡献。
最终答案
总初始疲劳 = 。
总最大减少 = 对每个未定向连通块 DP 得到的最优减少之和(根节点的最佳情况)。
答案 = 总初始疲劳 − 总最大减少。复杂度 ,来自排序。
示例验证(样例1)
边:
未定
未定
(因为 )未定向边构成两个连通块: 和 。
初始总疲劳 = $\sum \deg(i)t_i = 2\cdot40 + 3\cdot10 + 1\cdot30 + 1\cdot50 + 1\cdot20 = 80+30+30+50+20=210$。
DP 后最大减少 = ,答案 = ,与输出一致。
- 1
信息
- ID
- 6251
- 时间
- 1000ms
- 内存
- 256MiB
- 难度
- 1
- 标签
- 递交数
- 2
- 已通过
- 1
- 上传者