1 条题解
-
0
题目解析
本题要求计算树中每个节点的威胁值。威胁值定义为:从该节点出发,沿着到根节点的路径向上走,所有可能垂直路径的交替和的最大值。
交替和的计算规则:路径上的节点按从当前节点到根节点的顺序,符号交替变化(第一个节点取正,第二个取负,第三个取正,依此类推)。
核心思想
1. 符号规律
对于从节点 到根节点的路径,设路径上的节点序列为 ,则:
- 第 个节点( 自身)符号为
- 第 个节点(父节点)符号为
- 第 个节点符号为
- 第 个节点符号为
- 依此类推...
2. 动态规划状态定义
设:
- :从节点 出发的所有垂直路径中,交替和的最大值(这就是答案)
- :从节点 出发的所有垂直路径中,交替和的最小值
3. 递推关系推导
考虑节点 和它的父节点 :
计算
从节点 出发的垂直路径有两种情况:
-
路径只包含 自身:交替和
-
路径包含 和它的若干祖先:设从父节点 出发的某条路径的交替和为 ,则从 出发包含该路径的交替和为
为了最大化 ,需要 尽可能小。因此:
计算
同理,从节点 出发的最小交替和也有两种情况:
-
路径只包含 自身:
-
路径包含 和祖先:,此时需要 尽可能大才能让结果最小,所以:
4. 边界条件(根节点)
根节点 没有父节点,它的路径只能是它自身:
代码实现
递归函数设计
void solve(int v, int p, long long mini, long long maxi)参数含义:
v:当前节点p:父节点mini:父节点的 值(父节点的最小交替和)maxi:父节点的 值(父节点的最大交替和)
步骤详解
// 1. 计算当前节点的答案 f(v) res[v] = max(arr[v], mini * -1 + arr[v]); // 即:max(a_v, a_v - g(p)) // 2. 计算当前节点的最小交替和 g(v) mini = min(arr[v], maxi * -1 + arr[v]); // 即:min(a_v, a_v - f(p)) // 3. 递归处理子节点 for (int u : gr[v]) { if (u == p) continue; solve(u, v, mini, res[v]); } // 将当前节点的 g(v) 和 f(v) 传递给子节点初始化
根节点从
solve(0, -1, 0, 0)开始:mini = 0,maxi = 0
对于根节点:
res[0] = max(arr[0], 0 * -1 + arr[0]) = max(arr[0], arr[0]) = arr[0]; mini = min(arr[0], 0 * -1 + arr[0]) = min(arr[0], arr[0]) = arr[0];所以根节点的 ,,符合边界条件。
验证:
考虑第一个测试用例:
- 边:(节点编号从 开始,代码中转换为 索引)
计算过程
根节点 (索引 ):
节点 (索引 ,父节点 ):
- $f(1) = \max(5,\ 5 - g(0)) = \max(5,\ 5-4) = \max(5,1) = 5$
- $g(1) = \min(5,\ 5 - f(0)) = \min(5,\ 5-4) = \min(5,1) = 1$
节点 (索引 ,父节点 ):
- $f(2) = \max(2,\ 2 - g(1)) = \max(2,\ 2-1) = \max(2,1) = 2$
- $g(2) = \min(2,\ 2 - f(1)) = \min(2,\ 2-5) = \min(2,-3) = -3$
节点 (索引 ,父节点 ):
- $f(3) = \max(6,\ 6 - g(2)) = \max(6,\ 6-(-3)) = \max(6,9) = 9$
- $g(3) = \min(6,\ 6 - f(2)) = \min(6,\ 6-2) = \min(6,4) = 4$
节点 (索引 ,父节点 ):
- $f(4) = \max(7,\ 7 - g(0)) = \max(7,\ 7-4) = \max(7,3) = 7$
- $g(4) = \min(7,\ 7 - f(0)) = \min(7,\ 7-4) = \min(7,3) = 3$
最终 值:,与样例输出一致。
复杂度分析
- 时间复杂度:,每个节点只访问一次
- 空间复杂度:,存储树的邻接表和结果数组
由于所有测试用例的 之和不超过 ,完全可行。
总结
递推式 含义 节点 的最大交替和(答案) 节点 的最小交替和 边界条件 核心思想:
- 通过 DFS 遍历树,利用父节点已计算的值更新子节点
- 维护两个值:最大交替和 和最小交替和
- 子节点的 依赖父节点的 ,子节点的 依赖父节点的
一次 DFS 即可解决!
- 1
信息
- ID
- 7100
- 时间
- 1000ms
- 内存
- 256MiB
- 难度
- 3
- 标签
- 递交数
- 0
- 已通过
- 0
- 上传者