题目链接
分步分析:
1:区间[i,j]和为0 可以得到:sum[i]=sum[j]
2:如果一个区间[i,j]和为0那么从j+1开始才存在good区间
3:用last记录上一个可以包含的左端,那么每次加上i-last,遍历完就是答案
#include <bits/stdc++.h>
typedef long long ll;
using namespace std;
ll n, k, sum = 0, pos = 0, ans = 0;
map<ll, ll> m;
int main()
{
cin >> n;
m[0] = 1;
for (ll i = 1; i <= n; i++)
{
cin >> k;
sum += k;
pos = max(pos, m[sum]);
ans += i - pos;
m[sum] = i + 1;
}
cout << ans;
}