Codeforces Round #632 (Div. 2) C. Eugene and an array

题目链接
分步分析:
1:区间[i,j]和为0 可以得到:sum[i]=sum[j]
2:如果一个区间[i,j]和为0那么从j+1开始才存在good区间
3:用last记录上一个可以包含的左端,那么每次加上i-last,遍历完就是答案

#include 
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;
}

你可能感兴趣的:(学习)