1 条题解

  • 0
    @ 2026-4-18 14:11:33

    B. 最大和 详细题解

    题目核心理解

    给定一个长度为 nn 的数组 aa,需要执行恰好 kk 次操作。 每次操作可以选择任意连续子数组(可以为空),求出它的和并插入数组任意位置。

    kk 次操作后,数组能达到的最大可能和,结果对 109+710^9+7 取模。


    核心思路

    1. 关键符号与性质

    设:

    • ss:原数组所有元素的和
    • xx:数组的最大子段和(空子数组的和为 00,若所有子段和为负则取 00

    最优策略:

    • 每次操作都选择当前最大子段和并插入数组。
    • 每次插入后,新的最大子段和会变为原来的 22

    2. 增量规律

    • 11 次插入:新增 xx
    • 22 次插入:新增 2x2x
    • 33 次插入:新增 4x4x
    • ……
    • kk 次插入:新增 2k1x2^{k-1}x

    总增量是等比数列求和:

    x+2x+4x++2k1x=x(2k1)x + 2x + 4x + \dots + 2^{k-1}x = x\cdot(2^k - 1)

    算法流程

    1. 计算原数组的总和 ss
    2. 使用贪心算法(Kadane)求出数组的最大子段和 xx,并与 00 取最大值。
    3. 用快速幂计算 2kmod(109+7)2^k \bmod (10^9+7)
    4. 代入公式计算最终答案。
    5. 将结果对 109+710^9+7 取模并输出(保证非负)。

    公式与复杂度分析

    最终答案公式:

    ans=s+x(2k1)(mod109+7)ans = s + x\cdot(2^k - 1) \pmod{10^9+7}

    复杂度

    • 求数组和与最大子段和:O(n)O(n)
    • 快速幂计算 2k2^kO(logk)O(\log k)
    • 总时间复杂度:O(n+logk)O(n + \log k)

    可轻松处理 n,k2×105n,k \le 2\times10^5、多组数据总和限制。

    • 1

    信息

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