1 条题解

  • 0
    @ 2026-4-2 20:29:37

    题目大意

    给定一棵 nn 个节点的树,每个节点 ii 有两个值:

    • 疲劳值 tit_i(节点被覆盖一次就要累加一次 tit_i
    • 高度 hih_i

    每条边 (u,v)(u,v) 如果 huhvh_u \neq h_v,则方向已经确定(从低到高,因为挑战要求非降高度)。
    如果 hu=hvh_u = h_v,则方向未定,需要我们决定。

    我们要用若干条挑战(即节点序列,相邻节点有边,且高度非降)覆盖所有边,每条边恰好属于一个挑战。
    一个节点可以被多个挑战经过。
    一个挑战的疲劳值是其所有节点的 tt 之和。
    目标:最小化所有挑战的疲劳值总和。


    转化与观察

    • 一条挑战对应一条有向路径(按高度非降方向)。
    • huhvh_u \neq h_v,边 (u,v)(u,v) 方向固定(hh 小 → hh 大)。
    • hu=hvh_u = h_v,边方向未定。

    第一步:若所有边方向已定

    假设我们已经给每条边定向(满足 hh 不降方向)。

    初始方案:每条边 (uv)(u \to v) 作为一条长度为 22 的挑战(uvu \to v)。
    总疲劳值 = i=1ndeg(i)ti\sum_{i=1}^n \deg(i) \cdot t_i,其中 deg(i)\deg(i)ii 在原树中的度数(因为每个节点出现在每条邻边上一次)。

    合并挑战减少疲劳

    如果存在两条挑战 P(x,y)P(x,y)P(y,z)P(y,z),且 yyP(x,z)P(x,z) 上(即 xyzx \to y \to z 可拼接),可以合并成 P(x,z)P(x,z)
    合并后 yy 的疲劳值 tyt_y 少算一次(原来在两个挑战中各出现一次,现在只出现一次)。
    所以减少量 = tyt_y


    关键观察

    对于节点 ii,设:

    • iniin_i = 以 ii 为终点的挑战数
    • outiout_i = 以 ii 为起点的挑战数

    初始时(每条边单独成挑战):

    • iniin_i = 指向 ii 的边数
    • outiout_i = 从 ii 出发的边数

    合并操作相当于选择某个节点 yy,将其一个入边挑战和一个出边挑战合并,inyin_youtyout_y 各减少 11yy 的总疲劳减少 tyt_y
    每个节点最多可合并 min(ini,outi)\min(in_i, out_i) 次(因为每次减少一对入/出)。
    因此最大总减少量 = i=1nmin(ini,outi)ti\sum_{i=1}^n \min(in_i, out_i) \cdot t_i

    最终最小总疲劳 = 初始总疲劳 − 最大总减少。


    第二步:原问题(部分边方向未定)

    • huhvh_u \neq h_v 的边,方向固定,统计 iniin'_ioutiout'_i
    • hu=hvh_u = h_v 的边,方向未定,形成若干连通块(每个连通块内所有边 hh 相等)。

    在这些未定向的连通块上做树形 DP。


    DP 定义

    对每个连通块任选根。设 pup_uuu 的父亲。

    • fuf_u:边 (pu,u)(p_u, u) 方向为 puup_u \to u 时,uu 的子树内最大减少量。
    • gug_u:边 (pu,u)(p_u, u) 方向为 upuu \to p_u 时,uu 的子树内最大减少量。

    转移

    考虑节点 uu,它有 cc 个子节点 v1,,vcv_1, \dots, v_c

    对于每个子节点 vv

    • 如果边 (u,v)(u,v) 定向为 vuv \to u,则贡献 gvg_vvv 的子树已算好,且 vv 指向 uu)。
    • 如果定向为 uvu \to v,则贡献 fvf_v

    xx = 从子节点指向 uu 的边数(即选择 xxvvgvg_v,其余取 fvf_v)。

    那么 uu 的总减少量中,来自 uu 本身的贡献为:

    $$\min(in'_u + x + [p_u \to u], \; out'_u + (c - x) + [u \to p_u]) \cdot t_u $$

    其中 [puu][p_u \to u] 表示父亲边方向是否增加 inuin_u[upu][u \to p_u] 同理。

    我们要最大化:

    vAgv+vAfv\sum_{v \in A} g_v + \sum_{v \notin A} f_v

    对于每个可能的 x=Ax = |A|

    排序优化

    对子节点按 (fvgv)(f_v - g_v) 降序排序。
    SkS_k = 前 kk 个的 (fvgv)(f_v - g_v) 之和。
    则当 x=kx = k 时,最大值 = Sk+vgvS_k + \sum_{v} g_v

    这样对每个 xx 可以 O(1)O(1) 得到最大值。


    根节点处理

    对于根 rr,没有父亲边。
    xx 表示子节点指向 rr 的个数。
    贡献为:

    min(inr+x,  outr+(cx))tr\min(in'_r + x,\; out'_r + (c - x)) \cdot t_r

    加上子节点的贡献。


    最终答案

    总初始疲劳 = deg(i)ti\sum \deg(i) \cdot t_i
    总最大减少 = 对每个未定向连通块 DP 得到的最优减少之和(根节点的最佳情况)。
    答案 = 总初始疲劳 − 总最大减少。

    复杂度 O(nlogn)O(n \log n),来自排序。


    示例验证(样例1)

    n=5n=5
    t=[40,10,30,50,20]t = [40,10,30,50,20]
    h=[2,3,2,3,1]h = [2,3,2,3,1]

    边:
    (1,2):h1=2,h2=312(1,2): h_1=2,h_2=3 \Rightarrow 1\to 2
    (1,3):h1=2,h3=2(1,3): h_1=2,h_3=2 \Rightarrow 未定
    (2,4):h2=3,h4=3(2,4): h_2=3,h_4=3 \Rightarrow 未定
    (2,5):h2=3,h5=152(2,5): h_2=3,h_5=1 \Rightarrow 5\to 2(因为 h5<h2h_5 < h_2

    未定向边构成两个连通块:{1,3}\{1,3\}{2,4}\{2,4\}

    初始总疲劳 = $\sum \deg(i)t_i = 2\cdot40 + 3\cdot10 + 1\cdot30 + 1\cdot50 + 1\cdot20 = 80+30+30+50+20=210$。

    DP 后最大减少 = 5050,答案 = 21050=160210-50=160,与输出一致。

    • 1

    信息

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