D. Non-zero Segments Codeforces Round #674 (Div. 3)(前缀和)

 

 

题意 :就是给你一个序列,序列里不会有0,然后可以在任意两元素间插入任意数,让任意子序列和不为 0 。问需要插入的最少次数。

思路:处理前缀和,然后如果在 a[i] 处出现重复的前缀和说明这一段的和是0,然后ans++,这里需要添加一个数。在从a[i]处开始重新开始处理。

 

#include<bits/stdc++.h>
using namespace std;
const int N=2e5+10;
typedef long long ll;
int main()
{
    ll a[N];
    int n;
    cin>>n;
    for(int i=1; i<=n; i++)
    {
        cin>>a[i];
    }
    map<ll,ll>q;
    q[0]=1;
    ll sum=0;
    ll ans=0;
    for(int i=1; i<=n; i++)
    {
        sum+=a[i];
        if(q[sum]==1)
        {
            q.clear();
            ans++;
            sum=a[i];
            q[0]=1;
            q[sum]=1;
            //cout<<i<<"***"<<endl;

        }
        else
            q[sum]=1;
    }
    cout<<ans<<endl;



}
View Code

 

posted @ 2020-09-30 21:13  Swelsh-corgi  阅读(249)  评论(0编辑  收藏  举报