E

喜欢切数组的红

https://ac.nowcoder.com/acm/contest/96115/E

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)

全部评论
如果是一个2e5长度的1 -1重复的串,那么ans的大小将来到组合数C(1e5-1,2),你这样意思是每次操作ans只能加1,会超时
点赞 回复 分享
发布于 11-25 08:42 河南

相关推荐

牛客737698141号:他们可以看到在线简历的。。。估计不合适直接就拒了
点赞 评论 收藏
分享
10-17 12:16
同济大学 Java
7182oat:快快放弃了然后发给我,然后让我也泡他七天最后再拒掉,狠狠羞辱他一把😋
点赞 评论 收藏
分享
评论
5
收藏
分享
牛客网
牛客企业服务