1 条题解

  • 0
    @ 2026-8-20 23:25:12

    题解

    思路

    转化

    每次合并相邻元素,等价于把原序列划分成若干个非空连续段,并把每段替换为它的区间和。

    令前缀和为 Si=A1++AiS_i=A_1+\cdots+A_i。一个分段结果的前缀和序列,恰好是在 S1,S2,,SN1S_1,S_2,\ldots,S_{N-1} 中选择一个子序列,再在末尾固定追加 SNS_N。结果序列与其前缀和序列一一对应,固定追加同一个 SNS_N 也不会改变不同序列的数量。因此问题变为:求序列 S1,S2,,SN1S_1,S_2,\ldots,S_{N-1} 的不同子序列数量,空子序列也计入。

    做法

    动态规划

    DiD_i 表示前 ii 个前缀和能够形成的不同子序列数量,初始 D0=1D_0=1

    加入 SiS_i 时,原有每个子序列都可以选择不追加或追加 SiS_i,暂时得到 2Di12D_{i-1}。若 SiS_i 上一次出现在位置 pp,那么以这两个相同值分别作为最后一次追加所产生的重复部分,恰好有 Dp1D_{p-1} 个;没有出现过则无需扣除。因此

    Di=2Di1Dp1.D_i=2D_{i-1}-D_{p-1}.

    用映射记录每个前缀和值最后出现的位置,即可在线计算。

    对于 N20N\le20,可以枚举全部分界选择并把得到的块和序列放入集合。对于 N2000N\le2000,可向前扫描寻找相同前缀和,使转移达到平方复杂度。若所有 Ai>0A_i>0,前缀和严格递增,不会出现重复,答案直接是 2N12^{N-1}

    正确性证明

    任意操作只会合并相邻块,所以最终每个元素都是原序列某个连续段的和;反之,按任意连续分段依次合并段内元素都能得到对应结果。因此分段与可达结果完全对应。

    一个分段结果的前缀和,正是原前缀和序列中所有分界位置对应的值,再追加固定的总和 SNS_N。前缀和变换可逆,所以不同结果序列与 S1,,SN1S_1,\ldots,S_{N-1} 的不同子序列一一对应。

    转移中,不追加 SiS_i 保留全部 Di1D_{i-1} 个子序列,追加则再产生同样数量。若存在最近的相同值 Sp=SiS_p=S_i,重复的恰是由前 p1p-1 个元素任取子序列后追加该值的 Dp1D_{p-1} 种;更早的重复已包含在这组中。扣除后每种子序列恰计一次,递推正确。

    复杂度

    映射实现的时间复杂度为 O(NlogN)O(N\log N),空间复杂度为 O(N)O(N)

    • 1

    信息

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