YunYan

  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

题目大意:求好数组的个数,所谓好数组 1好数组是原数组的一段连续的子数组,2 好数组不包含元素和为0的子数组。

题解:唉,这个题目把我给些懵了....我一开始的想法求后缀和,保存位置,然后枚举前缀和,二分查找大于当前位置的第一个后缀合,但是ai的范围太大了,位置保存不了,然后又瞎搞了很久....最后看的题解,没想到这么简单....(吐了)直接用前缀和,如果两个前缀和相等比如果说[1,l]和[1,r]那么[l+1,r],这段区间内的和一定为0,

然后好数组怎么求呢?当然就是[l+2,r],[l+3,r]....[r,r]。也就是他的区间长度。。。我们可以枚举没个前缀和,让i做右端点,然后用mp保存最右边的左端点。

code:

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const ll N=2e5+7;
map<ll,ll >mp;
int main(){
    ll n;
    cin>>n;
    ll sum=0;
    ll tmp=0;
    mp[0]=1;
    ll x,maxl=1;
    ll ans=0;
    for(ll i=2;i<=n+1;i++){
        cin>>x;
        sum+=x;
        if(mp[sum]!=0) maxl=max(maxl,mp[sum]+1);
        ans+=i-maxl;
        mp[sum]=i;
    }
    cout<<ans<<endl;
    return 0;    
} 

 

posted on 2020-04-10 09:22  Target--fly  阅读(186)  评论(0编辑  收藏  举报