1 条题解

  • 0
    @ 2026-4-15 17:32:58

    题解

    我们按深度分层处理。设 dd 为叶子深度,节点 ii 的深度为 depth[i]\text{depth}[i](根深度 00)。
    定义 dp[i]dp[i] 表示:经过 depth[i]\text{depth}[i] 次移动后(即第 depth[i]\text{depth}[i] 步结束后),红币在节点 ii 时所能获得的最大总分。
    答案即为所有深度 dd 的节点中 dp[i]dp[i] 的最大值。

    转移分析

    考虑从深度 h1h-1 转移到深度 hh。设当前层(深度 hh)的节点集合为 LhL_h
    对于 iLhi \in L_h,上一步(深度 h1h-1)结束时红币在某个节点 ppppii 的父节点或其它节点),蓝币在任意节点 qq(深度 h1h-1)。
    hh 步包含三个操作:

    1. 红币移动到它的一个孩子(记为 xxxLhx \in L_h)。
    2. 蓝币移动到任意一个深度 hh 的节点(记为 yyyLhy \in L_h)。
    3. 可以选择交换两枚硬币。

    最终红币在 ii,蓝币在另一个节点,得分增加 aa|a_{\text{红}} - a_{\text{蓝}}|

    根据第三步是否交换,分为两种情况:

    情况一:不交换

    此时红币就是第一步移动到的节点,即 i=xi = x

    • 上一步红币必须在 ii 的父节点 parent[i]\text{parent}[i](唯一)。
    • 蓝币可以移动到任意 yLhy \in L_h,得分 aiay|a_i - a_y|
    • 上一步总分 dp[parent[i]]dp[\text{parent}[i]](红币在父节点时的最优值)。
    • 蓝币的先前位置不影响本轮(因为本轮蓝币可以任意跳),所以本轮总分为
    $$ dp[\text{parent}[i]] + \max_{y \in L_h} |a_i - a_y|. $$

    由于 $\max_{y \in L_h} |a_i - a_y| = \max(a_i - \min L_h,\ \max L_h - a_i)$,其中 minLh\min L_hmaxLh\max L_h 是当前层所有 aa 的最小值和最大值。
    因此情况一的候选值为

    $$\text{best1}(i) = dp[\text{parent}[i]] + \max(a_i - \min,\ \max - a_i). $$

    情况二:交换

    此时红币在第三步后变成了蓝币移动到的节点,即 i=yi = y

    • 上一步红币在某个节点 pp(深度 h1h-1),它有一个孩子 xLhx \in L_h 作为第一步的红币目标。
    • 蓝币移动到 y=iy = i
    • 交换后红币在 ii,蓝币在 xx,得分 axai|a_x - a_i|
    • 上一步总分 dp[p]dp[p],而 p=parent[x]p = \text{parent}[x]

    因此对固定的 ii,候选值为

    $$\max_{x \in L_h} \big( dp[\text{parent}[x]] + |a_x - a_i| \big). $$

    val[x]=dp[parent[x]]\text{val}[x] = dp[\text{parent}[x]],则上式变为

    $$M(i) = \max_{x \in L_h} \big( \text{val}[x] + |a_x - a_i| \big). $$

    高效计算 M(i)M(i)

    利用绝对值拆解:

    $$\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). $$

    则对于任意 ii

    M(i)=max(A+ai, Bai).M(i) = \max(A + a_i,\ B - a_i).

    因此,对每一层,我们可以先遍历一次计算 AABB,再遍历一次计算每个 iiM(i)M(i),时间复杂度 O(Lh)O(|L_h|)

    初始条件

    深度 00 只有根节点 11,我们设 dp[1]=0dp[1] = 0(无得分),且根没有 aa 值(不参与绝对值计算)。
    对于深度 11 的节点 iiparent[i]=1\text{parent}[i] = 1dp[parent[i]]=0dp[\text{parent}[i]] = 0val[x]=0\text{val}[x] = 0,因此

    $$\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|, $$

    两者相等,故 dp[i]=maxyL1aiaydp[i] = \max_{y \in L_1} |a_i - a_y|,符合直观。

    算法步骤

    1. 读入 nn,建树,以 11 为根进行 BFS/DFS,记录每个节点的父节点 parent[i]\text{parent}[i] 和深度 depth[i]\text{depth}[i],同时将同一深度的节点放入 vector 数组 nodes[h]
    2. 读入 a2ana_2 \dots a_n,可忽略 a1a_1
    3. 初始化 dp[1]=0dp[1] = 0
    4. 按深度 h=1,2,,dh = 1, 2, \dots, d 依次处理:
      • 获取当前层节点列表 layer = nodes[h]
      • 计算 min=minilayerai\min = \min_{i \in layer} a_imax=maxilayerai\max = \max_{i \in layer} a_i
      • 对每个 ilayeri \in layer,计算$$\text{best1} = dp[\text{parent}[i]] + \max(a_i - \min,\ \max - a_i). $$
      • 初始化 A=A = -\inftyB=B = -\infty
        对每个 xlayerx \in layer,计算 val=dp[parent[x]]\text{val} = dp[\text{parent}[x]],更新
        A=max(A, valax)A = \max(A,\ \text{val} - a_x)B=max(B, val+ax)B = \max(B,\ \text{val} + a_x)
      • 再次遍历 ilayeri \in layer,计算
        M=max(A+ai, Bai)M = \max(A + a_i,\ B - a_i)
        dp[i]=max(best1, M)dp[i] = \max(\text{best1},\ M)
    5. 答案 =maxi:depth[i]=ddp[i]= \max_{i: \text{depth}[i]=d} dp[i]

    复杂度

    每层遍历常数次,总时间复杂度 O(n)O(n),空间复杂度 O(n)O(n)

    • 1

    信息

    ID
    6527
    时间
    1000ms
    内存
    256MiB
    难度
    7
    标签
    递交数
    1
    已通过
    1
    上传者