题意:给你n个数的数组,让你求它的子区间和中不含0的区间总数。
思路:前缀,我们可以记录这个数组的前缀,如果
p
r
e
[
i
]
=
=
p
r
e
[
j
]
pre[i]==pre[j]
pre[i]==pre[j],那么就说明
i
到
j
i到j
i到j之间和为0,那我们记录的就不能包含这个区间。这道题我们用
m
a
p
map
map寻找一个区间和为0的开头位置。
我们
a
n
s
ans
ans每次记录就是从第一个不含有完整0区间的地方到当前位置的区间数。即
a
n
s
+
=
i
−
q
−
1
ans+=i-q-1
ans+=i−q−1((刚开始也是没想到记录区间的方法,看了大佬的博客,这个地方想了好久才明白)
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<algorithm>
#include<queue>
#include<vector>
#include<math.h>
#include<bits/stdc++.h>
#include<map>
using namespace std;
#define LL long long
const int N=1e5+10;
map<LL,LL>p;
int main()
{
ios::sync_with_stdio(false);
cin.tie(0);
int n;
cin>>n;
LL s=0;
LL x;
p[0]=0;
LL q=-1;
LL ans=0;
for(int i=1;i<=n;i++)
{
cin>>x;
s+=x;
if(p.count(s))
{
q=max(q,p[s]);
//printf("%lld\n",p[s]);
}
ans+=i-q-1;
// printf("%lld** ",ans);
p[s]=i;
}
cout<<ans<<endl;
return 0;
}