1 条题解
-
0
题解
我们按深度分层处理。设 为叶子深度,节点 的深度为 (根深度 )。
定义 表示:经过 次移动后(即第 步结束后),红币在节点 时所能获得的最大总分。
答案即为所有深度 的节点中 的最大值。转移分析
考虑从深度 转移到深度 。设当前层(深度 )的节点集合为 。
对于 ,上一步(深度 )结束时红币在某个节点 ( 是 的父节点或其它节点),蓝币在任意节点 (深度 )。
第 步包含三个操作:- 红币移动到它的一个孩子(记为 ,)。
- 蓝币移动到任意一个深度 的节点(记为 ,)。
- 可以选择交换两枚硬币。
最终红币在 ,蓝币在另一个节点,得分增加 。
根据第三步是否交换,分为两种情况:
情况一:不交换
此时红币就是第一步移动到的节点,即 。
- 上一步红币必须在 的父节点 (唯一)。
- 蓝币可以移动到任意 ,得分 。
- 上一步总分 (红币在父节点时的最优值)。
- 蓝币的先前位置不影响本轮(因为本轮蓝币可以任意跳),所以本轮总分为
由于 $\max_{y \in L_h} |a_i - a_y| = \max(a_i - \min L_h,\ \max L_h - a_i)$,其中 和 是当前层所有 的最小值和最大值。
$$\text{best1}(i) = dp[\text{parent}[i]] + \max(a_i - \min,\ \max - a_i). $$
因此情况一的候选值为情况二:交换
此时红币在第三步后变成了蓝币移动到的节点,即 。
- 上一步红币在某个节点 (深度 ),它有一个孩子 作为第一步的红币目标。
- 蓝币移动到 。
- 交换后红币在 ,蓝币在 ,得分 。
- 上一步总分 ,而 。
因此对固定的 ,候选值为
$$\max_{x \in L_h} \big( dp[\text{parent}[x]] + |a_x - a_i| \big). $$记 ,则上式变为
$$M(i) = \max_{x \in L_h} \big( \text{val}[x] + |a_x - a_i| \big). $$高效计算
利用绝对值拆解:
$$\text{val}[x] + |a_x - a_i| = \max\big( (\text{val}[x] - a_x) + a_i,\ (\text{val}[x] + a_x) - a_i \big). $$令
$$A = \max_{x \in L_h} (\text{val}[x] - a_x),\quad B = \max_{x \in L_h} (\text{val}[x] + a_x). $$则对于任意 ,
因此,对每一层,我们可以先遍历一次计算 和 ,再遍历一次计算每个 的 ,时间复杂度 。
初始条件
深度 只有根节点 ,我们设 (无得分),且根没有 值(不参与绝对值计算)。
$$\text{best1}(i) = \max(a_i - \min L_1,\ \max L_1 - a_i),\quad M(i) = \max_{x \in L_1} |a_x - a_i|, $$
对于深度 的节点 ,,,,因此两者相等,故 ,符合直观。
算法步骤
- 读入 ,建树,以 为根进行 BFS/DFS,记录每个节点的父节点 和深度 ,同时将同一深度的节点放入
vector数组nodes[h]。 - 读入 ,可忽略 。
- 初始化 。
- 按深度 依次处理:
- 获取当前层节点列表
layer = nodes[h]。 - 计算 ,。
- 对每个 ,计算$$\text{best1} = dp[\text{parent}[i]] + \max(a_i - \min,\ \max - a_i). $$
- 初始化 ,。
对每个 ,计算 ,更新
,。 - 再次遍历 ,计算
,
。
- 获取当前层节点列表
- 答案 。
复杂度
每层遍历常数次,总时间复杂度 ,空间复杂度 。
- 1
信息
- ID
- 6527
- 时间
- 1000ms
- 内存
- 256MiB
- 难度
- 7
- 标签
- 递交数
- 1
- 已通过
- 1
- 上传者