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; }