日程题解

求有多少个合法的 01 串 S,长度为 k, n 个限制: S[l, r] 至少有一个 1 m 个限制: S[l, r] 至少有一个 0

    其中 1 代表学习,0 代表颓废。

    ##10pts k <= 1000

  dp,f[i][0 / 1] : 考虑前 i 位,S[i] 填 0 / 1,满足要求的 方案数

  i->i +1,需要判断 i +1 填 0 / 1 是否满足条件?

  同类限制,同一个 r,只需要考虑 最大的 l

   对于每一个 r,记录 req1[r] ,req0[r]

   r 填 1, [req0[r], r] 至少有一个 0,r 的上一个 0 位置 >=req0[r] r 填 0, r 的上一个 1 位置 >= req1[r]

   加一维:f[i][0 / 1][j] :考虑前 i 位,S[i] 填 0 1,上一个和 S[i] 不同的字符位于 j 位置,方案数

 i 填 0 / 1, i +1 填 0 / 1 分类讨论

                                                  ##25pts k <=
    10 ^
9

n,m 比较小,不同的 l,
r 最多只有(2n + 2m) 个 所有的 l,
r 离散化

        离散化:用数据的排名代替数据的一种思想 离散化可以保证大小关系不变,原数不重要

        关键点:所有 l、r;1,k

        v[i] 表示第 i 个关键点<!--记[v[i - 1] + 1, v[i]] 为“第 i 段”, 特别地,[1, 1] 为 第 1 段-->

        f[i][0 / 1][j] : i:考虑前 i 段 0 / 1:第 i 段 全部填 0 /全部填 1 j:上一个与第 i 段字符不同的位置位于第 j 段
        (第 i 段长度>= 2 时)第 i 段有 0 有 1? g[i] ,不需要记录额外的信息
         req0、req1 表示 max l 所在段的编号
         f[i] ->f[i + 1] i 全填 0 /1, i + 1 全填 0 / 1 
         分类讨论 g[i]->f[i + 1] 第 i 段有 0 有 1,第 i + 1 段全0 / 全1: 只有 req0[i + 1] = i + 1 或 req1[i + 1] = i +
                                                                     1 时,可能不满足 req0[i + 1] = i + 1,
                                         i + 1 段不能全 0 req0[i + 1] <= i,一定满足

                                             req1[i + 1] = i + 1,
                                         i + 1 段不能全 1 req1[i + 1] <= i,一定满足

                                                                         f[i]
                                                                             ->g[i + 1],
                                         g[i]->g[i + 1] 第 i + 1 段有 0 有 1: i +
                                             1 的所有要求一定满足

                                             O((n + m) ^ 2) 25pts

                                             ##100pts

                                             前缀和优化
posted @ 2025-07-03 17:18  xinyimama  阅读(6)  评论(0)    收藏  举报