1 条题解

  • 0
    @ 2026-4-6 0:39:25

    我们按位独立解决该问题,最后将每一位的结果相乘。

    显然,如果某个位置被一个值为 11 的区间覆盖,则该位置必须为 11,没有选择余地。
    对于值为 00 的区间,必须存在至少一个被它覆盖的位置,其值为 00

    因此我们可以设计如下动态规划:
    dpidp_i 表示满足以下条件的数组个数:最后一个 00 恰好出现在位置 ii,且所有位于 ii 左侧的 00 区间都至少包含一个 00

    我们需要确定可以从哪些状态 jj 转移到 ii
    唯一的限制是:不能存在一个值为 00 的区间 (l,r)(l, r),使得 j<lj < lr<ir < i
    因为如果存在这样的区间,它就不会包含任何 00 值,违反条件。

    对于每个位置 ii,我们可以预先计算出 fif_i,表示所有右端点小于 ii00 区间的左端点的最右位置。
    换句话说,fif_i 是满足:存在一个 00 区间 (l,r)(l, r)r<ir < i 的所有 ll 中的最大值。
    那么转移时,dpidp_i 只能从 jfij \ge f_i 的状态累加。

    于是转移方程为:

    dpi=j=fii1dpjdp_i = \sum_{j = f_i}^{i-1} dp_j

    边界条件可以设置一个虚拟位置 00 表示“尚未出现 00”,相应的 dp0=1dp_0 = 1,并据此计算前缀和。

    利用前缀和,可以在 O(n)O(n) 时间内完成 DP 计算,最后答案为所有 dpidp_i 的和,对应最后一个 00 出现在任意位置的情况。

    将每一位的答案相乘,即得到原问题的最终答案。

    • 1

    信息

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