1 条题解

  • 0
    @ 2026-4-5 13:53:29

    题解:Dreaming Is Not Harmful

    题目分析

    核心规则

    1. 公司结构是11 为根的树,员工 vv 的直属上级是 pvp_v,能力值 svs_v 互不相同,值越大能力越强。
    2. 每日淘汰规则:根节点(CEO)被开除,能力最强的直接子节点继任为新根,原根的其他子节点成为新根的直接子节点。
    3. 每个员工 vv 能算出不取消任何人时自己成为 CEO 的天数 tvt_v
    4. 询问:对 vkv_k恰好取消一个员工(将其 ss00),求 vkv_k 成为 CEO 的最小天数
    5. 所有询问独立,不修改原始数据。

    关键观察

    1. 继任顺序完全由能力值排序决定:每天淘汰当前根,下一个根是当前根的最大 ss 子节点
    2. 全局能力降序排列u1,u2,,unu_1, u_2, \ldots, u_nsu1>su2>>suns_{u_1} > s_{u_2} > \ldots > s_{u_n}),则:
      • 11 天 CEO:u1u_1
      • 22 天 CEO:u2u_2
      • \ldots
      • kk 天 CEO:uku_k 因此原始天数 tv=rank(v)1t_v = \text{rank}(v) - 1rank(v)\text{rank}(v)vv 在全局降序中的排名)。
    3. 取消一个员工 xx,等价于删除 xx,新的继任序列是原序列去掉 xx,新天数 tv=new_rank(v)1t'_v = \text{new\_rank}(v) - 1
    4. 目标:对 vv,选一个 xx 删除,使得 new_rank(v)\text{new\_rank}(v) 最小,即 tvt'_v 最小。

    核心转化

    R(v)R(v)vv原始能力降序中的排名,则:

    • 不删除时:ans=R(v)1\text{ans} = R(v) - 1
    • 删除 xx 时:
      • xxvv 之前R(x)<R(v)R(x) < R(v)):new_rank(v)=R(v)1\text{new\_rank}(v) = R(v) - 1ans=R(v)2\text{ans} = R(v) - 2
      • xxvv 之后R(x)>R(v)R(x) > R(v)):new_rank(v)=R(v)\text{new\_rank}(v) = R(v)ans=R(v)1\text{ans} = R(v) - 1
      • x=vx = v:无效(取消自己无法成为 CEO)

    终极结论

    对询问 vv

    1. v=1v = 1(根节点):答案为 00
    2. 否则:
      • 存在至少一个节点 xx,满足 R(x)<R(v)R(x) < R(v),且 xxvv 的「继任依赖链」上:答案为 R(v)2R(v) - 2
      • 否则:答案为 R(v)1R(v) - 1

    树的继任依赖链(关键定义)

    一个节点 xx阻碍 vv 快速继任,当且仅当 xxvv 到根的路径上,在原始继任过程中,会比 vv 先成为根的节点

    简化:对每个节点 vv,定义前驱集合 P(v)P(v):所有满足 R(x)<R(v)R(x) < R(v),且 xxvv祖先(含父节点、根)的节点。

    • P(v)P(v) \neq \emptyset:删除 P(v)P(v) 中任意一个 xxvv 的排名提前 11,答案 =R(v)2= R(v) - 2
    • P(v)=P(v) = \emptyset:无法提前,答案 =R(v)1= R(v) - 1

    算法步骤

    步骤1:预处理排名

    1. 读取树结构、能力值 ss
    2. 对所有节点按 ss降序排序,得到排名数组 rank[1n]\text{rank}[1 \ldots n]rank[v]\text{rank}[v]vv 的排名)。

    步骤2:预处理祖先的最小排名

    对每个节点 vv,维护从根到 vv 的路径上,最小的 rank 值(记为 min_anc_rank[v]\text{min\_anc\_rank}[v]):

    $$\text{min\_anc\_rank}[v] = \min(\text{rank}[v], \text{min\_anc\_rank}[p_v]) $$

    步骤3:回答询问

    对每个询问 vv

    1. v=1v = 1:输出 00
    2. 否则:
      • min_anc_rank[pv]<rank[v]\text{min\_anc\_rank}[p_v] < \text{rank}[v]:说明存在祖先 xx 满足 R(x)<R(v)R(x) < R(v),答案 =rank[v]2= \text{rank}[v] - 2
      • 否则:答案 =rank[v]1= \text{rank}[v] - 1

    复杂度分析

    • 排序:O(nlogn)O(n \log n)
    • 遍历树预处理 min_anc_rank\text{min\_anc\_rank}O(n)O(n)
    • 回答询问:O(q)O(q)

    总复杂度:O(nlogn+q)O(n \log n + q)完全满足 n,q3×105n, q \leq 3 \times 10^5 的约束


    总结

    1. 核心:继任顺序 = 能力值降序,天数 = 排名 - 1。
    2. 取消一个节点的最优选择:删除排名比 vv 靠前的祖先,让 vv 排名提前 11
    3. 算法线性遍历 + 排序,高效处理大数据量。
    • 1

    信息

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