E
喜欢切数组的红
https://ac.nowcoder.com/acm/contest/96115/E
E解题思路
要将数组切分成三个满足条件的子数组,需要满足以下条件:
-
总和可被3整除:数组的总和 必须能够被3整除,否则无法均分为三个相等的子数组。
-
每个子数组至少有一个正数:在切分的位置,需要确保每个子数组包含至少一个正数。
-
子数组和相等:每个子数组的和必须等于 。
具体步骤
-
计算前缀和:计算数组的前缀和 。
-
确定目标和:设置每个子数组的目标和 。
-
记录满足条件的位置:
- 遍历数组,计算前缀和 和正数的累计个数 。
- 当 且当前子数组有正数时,记录此位置对应的正数频率。
-
统计切分方案:
- 使用累积和 来快速计算满足 的位置数。
- 对于每个满足 的位置,累加符合条件的方案数。
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)