Codeforces 1333 C. Eugene and an array

  • 一个数组当它的所有子数组和都不为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;
}

posted @ 2020-04-29 23:26  A_sc  阅读(124)  评论(0编辑  收藏  举报