#牛客春招刷题训练营# + 链接
1.区间和的条件不好处理,转换为总和的三分之一以及前缀和。
2.区间内至少有一个正数,转换为下一个正数的索引。
3.向后计数,转换为计数的后缀和。
#include <iostream>
using namespace std;
using ll = long long;
const int MAXN=200010;
int a[MAXN], ddr[MAXN], np[MAXN];
ll s[MAXN];
int main() {
int n;
scanf("%d", &n);
for (int i=1;i<=n;i++) scanf("%d",a+i);
for (int i=1;i<=n;i++) s[i]=s[i-1]+a[i];
int x=n+1;
for (int i=n;i>0;i--) {
np[i] = x;
if (a[i]>0) x=i;
}
ll mm = s[n]/3;
if (mm*3!=s[n]) {
puts("0");
return 0;
}
ll ans=0;
for (int i=n;i>0;i--) {
ddr[i] = ddr[i+1]+ (s[i]==mm*2);
}
for (int i=1;i<=n;i++) {
if (s[i]==mm) ans+=ddr[np[i]];
}
printf("%lld\n", ans);
return 0;
}



京公网安备 11010502036488号