1 条题解
-
0
题目翻译
E2. 距离树(困难版)
给定一棵 个节点的树,每条边的权值为 。记 为节点 到节点 的距离。
你可以临时在任意两个节点 之间添加一条权值为 的边(添加后图不再是树)。定义 为添加这条边后, 可能的最小值。
对每个 ,求出 。
题解思路
1. 基本观察
- 以 为根,记 为原树中 到 的距离(即深度)。
- 添加一条边后,从 到 的新距离为 。
- 若某节点的深度已经 ,则无需考虑;否则需要利用新边缩短距离。
- 设 $S_{\text{ans}} = \{v \mid \text{dep}[v] > \text{ans}\}$,并记 为 中任意两点在原树中的最大距离(直径)。若 为空,则 。
2. 可行性判定
对于固定的 ,如果存在一条权值为 的边,使得新图中从 出发的最远距离 ,则必须满足:
- 要么 (此时无需加边);
- 要么 $\left\lceil \dfrac{L_{\text{ans}}}{2} \right\rceil + x \le \text{ans}$。
解释:最优加边策略是连接 与 的“中心”(直径中点),这样从 到 中任意点的距离不超过 。因此,当 时, 可行。
3. 计算 数组
我们需要对每个 求出 。
使用树形 DP:- 第一次 DFS 计算 。
- 第二次 DFS 后序遍历,计算 :从 向下走到最深叶子的边数。
- 对于每个节点 ,收集所有孩子 的 ,取出最大值 和次大值 (不足则补 )。
这两条链的端点深度分别为 和 ,它们的距离为 。
该距离对阈值 有贡献当且仅当 $\text{ans} < \min(\text{dep}[v]+h_1,\ \text{dep}[v]+h_2)$,即 。
令 $\text{lim} = \min(\text{dep}[v]+h_1,\ \text{dep}[v]+h_2)-1$,若 ,则
- 处理完所有节点后,对 数组从大到小做后缀最大值:
此时 即为 。
4. 由 得到
记 $T_{\text{ans}} = \text{ans} - \left\lceil \dfrac{L_{\text{ans}}}{2} \right\rceil$。
对于固定的 ,最小的可行 就是满足 的最小 (若不存在则取 )。
由于 随 单调不减,可以用双指针:- 初始化 ,结果数组 全部设为 。
- 对 从 到 :
- 当 且 时,。
- 若 ,则 ;否则 。
最后输出 。
5. 复杂度
- DFS 两次
- 计算 数组
- 后缀最大值
- 双指针
总时间复杂度 ,空间复杂度 。
示例验证
以第一个测试用例为例:
- ,树边:1-2, 2-3, 1-4
- 计算得 ,
- 得到
- 双指针:
- : → , →
- : → , →
- : →
- 输出
1 2 2 2,与样例一致。
代码实现要点
- 使用邻接表存图。
- DFS 可用栈迭代避免递归深度过大。
- 注意数组下标从 开始, 大小设为 。
- 计算 可用
(L+1)/2。
- 1
信息
- ID
- 6529
- 时间
- 1000ms
- 内存
- 256MiB
- 难度
- 9.5
- 标签
- 递交数
- 0
- 已通过
- 0
- 上传者