1 条题解

  • 0
    @ 2026-9-3 10:55:54

    题解

    思路

    若选择第 pp 个怪物作为爆炸中心,普通攻击后仍由连锁爆炸击杀的怪物必须构成包含 pp 的连续段。它们的生命值从 pp 向两侧每走一步至少下降 11。为了节省最多普通攻击,应在不超过初始生命值的前提下尽量保留这些生命值。

    设 LiL_i 为以 ii 作为最右端、向左每步至少减一时能保留的最大生命值总和,RiR_i 对称定义。若原数组总生命值为 SS,以 ii 为中心的总代价为

    S−Li−Ri+2hi.S-L_i-R_i+2h_i.

    其中 hih_i 在 Li,RiL_i,R_i 中各计算一次,而最后还要支付 hih_i 点爆炸能量。

    做法

    平方做法枚举中心后向两侧贪心令当前生命值为 min(初始生命值, 上一个生命值-1)。

    满分做法线性求 LL。处理位置 ii 时,需要找到最近的 j<ij<i,满足 hj−j≤hi−ih_j-j\le h_i-i;同时保留生命值不能降到零,所以还有边界 j≥i−hij\ge i-h_i。最近合法位置由维护 hj−jh_j-j 的单调栈得到。设 len=i−jlen=i-j,则新形成的等差段贡献

    len⋅hi−len(len−1)2,len\cdot h_i-\frac{len(len-1)}2,

    若没有在零处截断,再加上 LjL_j。反转数组同样计算 RR,最后枚举中心取最小值。

    复杂度

    每个位置至多进栈、出栈一次,时间复杂度为 O(∑n)O(\sum n),空间复杂度为 O(max⁡n)O(\max n)。

    • 1

    信息

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