codeforces-1333C-Eugene and an array

Posted yangkun-

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了codeforces-1333C-Eugene and an array相关的知识,希望对你有一定的参考价值。

传送门:https://codeforces.com/contest/1333/problem/C

题意:如果一个数组的子数组(连续)里的值相加都不为0,那么称他为好数组,给出一个数组,问他的多少子数组是好数组(包括它本身)

一个好数组就不含总价值为0的子数组,那么如何判断他含不含总价值为0的子数组呢?

一个前缀和就搞得定,两个前缀和相等的数中间夹着的就是总价值为0的子数组,对吧

那么问题就变成了:对于每个以R为右端点的子数组,如何找到最小的左端点L,满足前缀和区间[L,R]的数字都不相同

然后双指针维护

 

#include<bits/stdc++.h>
using namespace std;
#define ll long long
int a[200009],b[200009],z[200009];
ll sum[200009];
int main()
{
    int n;
    scanf("%d",&n);
    for(int i=1;i<=n;i++) scanf("%d",&a[i]),sum[i]=sum[i-1]+a[i];
    map<ll,int>mp;
    ll ans=0;
    int l=0;
    mp[0]=1;
    for(int i=1;i<=n;i++)
    {
        while(mp[sum[i]]) mp[sum[l++]]--;
        mp[sum[i]]++;
        ans+=(i-l);
    }
    printf("%lld
",ans);
    return 0;
}

 

以上是关于codeforces-1333C-Eugene and an array的主要内容,如果未能解决你的问题,请参考以下文章

CodeForces 1333-C Eugene and an array(子区间和为0前缀和)

Codeforces 1333E Road to 1600

Codeforces 1333C Eugene and an array

Codeforces 1333D - Challenges in school №41(模拟)

在python中,a+=a-=a的值是多少?

20170924 a20170924 a