#牛客春招刷题训练营# + 链接
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; }