E解题思路

要将数组切分成三个满足条件的子数组,需要满足以下条件:

  1. 总和可被3整除:数组的总和 必须能够被3整除,否则无法均分为三个相等的子数组。

  2. 每个子数组至少有一个正数:在切分的位置,需要确保每个子数组包含至少一个正数。

  3. 子数组和相等:每个子数组的和必须等于

具体步骤

  1. 计算前缀和:计算数组的前缀和

  2. 确定目标和:设置每个子数组的目标和

  3. 记录满足条件的位置

    • 遍历数组,计算前缀和 和正数的累计个数
    • 且当前子数组有正数时,记录此位置对应的正数频率。
  4. 统计切分方案

    • 使用累积和 来快速计算满足 的位置数。
    • 对于每个满足 的位置,累加符合条件的方案数。
def solve():
    n = II()
    a = LII()
    total = sum(a)
    if total % 3 != 0:
        print(0)
        return
    m = total // 3
    pre = [0] * n
    f = [0] * n
    last = -1
    freq = [0] * (n + 1)  
    for i in range(n):
        pre[i] = pre[i - 1] + a[i]
        f[i] = f[i - 1] + (a[i] > 0)
        if a[i] > 0:last = i
        if pre[i] == m and f[i]:
            freq[f[i]] += 1

    g = list(accumulate(freq))
    res = 0
    for i in range(1, last + 1):
        if pre[i - 1] == 2 * m:
            x = f[i - 1] - 1
            if x >= 0:
                res += g[x]
    print(res)