1 条题解

  • 0
    @ 2026-9-3 10:39:39

    复制或前缀和 题解

    思路

    处理到位置 i−1i-1 时,以当前前缀和 ss 为状态。对 bib_i 有两种转移:令 ai=bia_i=b_i,新前缀和为 s+bis+b_i;或令当前前缀和等于 bib_i,新前缀和为 bib_i。当且仅当 s=0s=0 时,两种选择得到同一个 aia_i,必须只计一次。

    做法

    子任务 1 枚举每个位置采用哪种条件,显式构造数组并去重。

    子任务 2 显式保存所有可能前缀和及方案数,每轮遍历全部状态完成两种转移,复杂度 O(n2)O(n^2)。

    满分算法令所有状态统一带一个偏移量。第一类转移只需把偏移量增加 bib_i;第二类转移把“当前总方案数减去旧前缀和为零的方案数”加入实际前缀和 bib_i 对应的状态。哈希表只新增一个相对键,因此每轮期望 O(1)O(1)。

    正确性证明

    每个混合数组在位置 ii 必然由上述两种条件之一产生。若旧前缀和非零,两种条件给出的 aia_i 不同;若旧前缀和为零,两种条件都给出 ai=bia_i=b_i,只应保留一次。递推恰好对这一重合部分减重,故每个不同数组被计数一次。偏移量只是同时平移第一类转移的所有前缀和,不改变方案数,因而优化后的递推等价且正确。

    复杂度

    每个测试用例期望时间复杂度 O(n)O(n),空间复杂度 O(n)O(n)。

    • 1

    信息

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