1 条题解

  • 0
    @ 2026-8-30 11:00:35

    最大子数组题解

    思路

    先处理 x<0x<0:把 xx 取反,同时把 kk 改为 n−kn-k,就等价于交换“加”和“减”的位置,此后可设 x≥0x\ge0。

    考虑最终选中的某个子数组,设长度为 LL。为了使它的和最大,应尽量把加 xx 的位置放在子数组内,因此其中有 min⁡(k,L)\min(k,L) 个位置加 xx。该子数组的最优贡献为原和加上

    x(2min⁡(k,L)−L).x(2\min(k,L)-L).

    当 L≤kL\le k 时,这等于在每个元素上加 xx 后求长度不超过 kk 的最大子数组;当 L≥kL\ge k 时,这等于在每个元素上减 xx 后求长度不少于 kk 的最大子数组,再加 2kx2kx。

    做法

    分别建立 ai+xa_i+x 与 ai−xa_i-x 的前缀和。

    • 对长度不超过 kk 的部分,维护当前右端点前最近 kk 个前缀和的最小值,可用单调队列完成。
    • 对长度不少于 kk 的部分,随右端点推进维护下标不超过 r−kr-k 的最小前缀和。

    两部分与空子数组答案 00 取最大值。

    复杂度

    每组测试的时间复杂度为 O(n)O(n),空间复杂度为 O(n)O(n)。

    • 1

    信息

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