Non-zero Segments VJ-HZNU-FPT1

题意:给定一个序列,可以在任意相邻对中添加任意大小的数使得不存在一个子序列的和为 0,求最小添加次数。

2<=n<=200000,-109<=ai<=109;

思路:用sum求前缀和,用map存该前缀和之前是否出现过,若出现过,ans++,后面关系与前面无关,清空map。

code:
#include<iostream>
#include<map>
using namespace std;
typedef long long ll;
const int N=2e5+7;

ll a[N];

int main()
{
    int n;
    cin>>n;
    for(int i=1;i<=n;i++)
    {
        cin>>a[i];
    }
    int ans=0;
    ll sum=0;
    map<ll,int>mp;
    mp[0]++;
    for(int i=1;i<=n;i++)
    {
        sum+=a[i];
        if(mp[sum])
        {
            ans++;
            mp.clear();
            mp[0]++;
            sum=a[i];
            mp[sum]++;
        }
        else mp[sum]++;
    }
    cout<<ans<<endl;
}


 

posted @ 2023-02-25 20:22  阿丰大宝贝  阅读(30)  评论(0)    收藏  举报