1 条题解

  • 0
    @ 2026-8-25 17:08:43

    yyy loves OI IV 题解

    思路

    令膜拜 yyy 的学生贡献 +1+1,膜拜 c01 的学生贡献 1-1,并记前缀和为 sis_i。区间 (j,i](j,i] 中两类人数之差就是 sisjs_i-s_j

    dpidp_i 为划分前 ii 名学生所需的最少宿舍数。若最后一个宿舍对应 (j,i](j,i],它合法的条件是 sisjM|s_i-s_j|\le M,或者该区间全部为同一种数字。

    小规模可以枚举 jj。当 M10M\le10 时,记录每个前缀和值出现过的最小 dpdp,枚举 siMs_i-Msi+Ms_i+M 即可。满分范围需要维护前缀和值区间上的最小 dpdp,用线段树进行单点取最小和区间最小值查询。

    做法

    在线段树中先写入前缀 s0=0s_0=0 对应的 dp0=0dp_0=0。依次处理每个位置:

    1. 在线段树上查询值域区间 [siM,si+M][s_i-M,s_i+M] 的最小 dpjdp_j
    2. 维护当前同色连续段开始位置之前到 i1i-1 的最小 dpjdp_j,这正好覆盖“最后一段全部同色”的所有起点;
    3. 两类转移的较小值加一得到 dpidp_i,再用它更新前缀和值 sis_i 的位置。

    正确性证明

    考虑任意最优划分的最后一个宿舍 (j,i](j,i]。若它不是纯色段,则合法性等价于 sisjM|s_i-s_j|\le M,第一类区间最小值转移一定枚举到 jj。若它是纯色段,则 jj 位于当前同色连续段开始位置之前到 i1i-1 的范围,第二类转移一定枚举到 jj。因此算法不会漏掉任何合法的最后一段。

    反过来,第一类转移选出的区间满足人数差限制,第二类转移选出的区间全部同色,所以每个转移产生的最后一个宿舍都合法。由 dp0=0dp_0=0 归纳可知,dpidp_i 恰为前 ii 人的最少宿舍数,故输出 dpNdp_N 正确。

    复杂度

    线段树做法的时间复杂度为 O(NlogN)O(N\log N),空间复杂度为 O(N)O(N)

    • 1

    信息

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