读完题还是能想到用前缀和的,用map记录前缀和是否出现过,从前往后遍历,如果出现过,ans++,sum = a[i],因为会插入新的数所以i以前的子串就不会再出现0的情况,只需要考虑后面的
#include<bits/stdc++.h>
#define ll long long
using namespace std;
const int maxn = 200005;
int n;
int a[maxn];
map<ll,int> m;
int main()
{
cin>>n;
ll ans = 0;
ll sum = 0;
for(int i = 1; i <= n; i++){
m[0] = 1;
cin>>a[i];
sum += a[i];//记录前缀和
if(m[sum] == 1){
ans++;
sum = a[i];/*因为前面已经插入新的数,故前面一定不会存在0子段,
可以不考虑了,记录新的前缀和*/
m.clear();//清空map
}
m[sum] = 1;//只记录最新的
}
cout<<ans;
}