1 条题解

  • 0
    @ 2026-8-30 10:57:11

    阻断元素 题解

    思路

    二分一个候选代价 xx。我们需要判断能否选出若干阻断位置,使被阻断元素之和不超过 xx,并且任意两个相邻阻断位置之间以及首尾两端的未阻断连续段之和都不超过 xx。

    记前缀和为 si=∑k=1iaks_i=\sum_{k=1}^i a_k。令 dpidp_i 表示把位置 ii 阻断,并且已经合法处理前 ii 个位置时,被阻断元素和的最小值;另设虚拟位置 00,dp0=0dp_0=0。若上一个阻断位置为 j<ij<i,则中间段合法当且仅当

    si−1−sj≤x,s_{i-1}-s_j\le x,

    于是

    dpi=ai+min⁡0≤j<i, si−1−sj≤xdpj.dp_i=a_i+\min_{0\le j<i,\ s_{i-1}-s_j\le x}dp_j.

    最后还要检查尾段,即在所有满足 sn−sj≤xs_n-s_j\le x 的 jj 中,是否存在 dpj≤xdp_j\le x。

    做法

    子任务 1 枚举阻断位置集合,直接计算阻断元素和与所有未阻断连续段之和,取最小值。复杂度为 O(2nn)O(2^n n)。

    子任务 2 对每个 ii 枚举所有 j<ij<i 完成上述转移。一次判定为 O(n2)O(n^2),配合二分的总复杂度为 O(n2log⁡S)O(n^2\log S),其中 S=∑aiS=\sum a_i。

    完整做法利用 ai>0a_i>0,因此前缀和严格递增。对每个 ii,合法的 jj 构成一个随 ii 右移的连续后缀。用单调队列维护窗口内 dpjdp_j 的最小值,一次判定为 O(n)O(n)。

    复杂度

    二分区间可取 [−1,S][-1,S]:SS 一定可行,而 −1-1 一定不可行。总时间复杂度为 O(nlog⁡S)O(n\log S),空间复杂度为 O(n)O(n)。所有前缀和与 DP 值必须使用 64 位整数。

    正确性说明

    任意合法方案按阻断位置顺序,都对应 DP 中从虚拟位置 00 出发的一条转移链;转移条件恰好保证两个相邻阻断位置之间的段和不超过 xx,转移代价之和恰好是阻断元素之和。反之,任意 DP 转移链都给出一组满足所有内部段限制的阻断位置;最终尾段检查补齐最后一段。因此判定等价于存在代价不超过 xx 的方案。

    可行性关于 xx 单调,故二分得到的最小可行值就是答案。

    • 1

    信息

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