- 一个数组当它的所有子数组和都不为0时,它是一个good数组。给一个长为n的数组问所给数组子数组中good数组个数。
- 如果两个不同位置的前缀和值相等,那这两个位置之间的数组和为0。对每个位置si考虑其贡献,用top表示一个限制,就是si和top以前的位置构成的数组一定包含一个和为0的子数组。所以si的贡献为si-(top - 1);
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N = 3e5 + 105;
const int mod = 998244353;
const double Pi = acos(- 1.0);
const int INF = 0x3f3f3f3f;
ll n, m;
ll sum[N];
ll a[N], res[N];
map<ll, ll>mp;
int main()
{
scanf("%lld",&n);
int flag = 0;
ll val = 0;
ll top = 0;
for(int i = 1; i <= n; ++ i){
scanf("%lld",&a[i]);
sum[i] = sum[i - 1] + a[i];
if(!mp[sum[i]]){
if(!sum[i]) top = max(top, 1ll);
}
else top = max(top, mp[sum[i]] + 1);
val += i - top;
mp[sum[i]] = i;
}
printf("%lld\n", val);
return 0;
}