Codeforces Round #632 (Div. 2)-1333
C. Eugene and an array
问题分析:
- 这里用到了 前缀和以及map<>;
- 利用 map的统计 和前缀和 来直观的判断 区间和为0;
- 当同一个 前缀和 出现2次的时候 一定是 这两个前缀和 中间区间和 为0
PS:因为统计的是 去头,去尾这种的所以才能用前缀和
- 这里从头开始 一次往后统计 并设置pos作为 跨越和为0的区间 变量
- 然后看统计图(跨越区间后 也通用 )
AC代码
#include<map>
#include<set>
#include<cmath>
#include<queue>
#include<vector>
#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
using namespace std;
#define ll long long
#define mem(a,b) memset((a),(b),sizeof(a));
map<ll,ll> mp;
const int inf=0x3f3f3f3f;//1061109567,2*未超int,allinf=mem(a,0x3f,sizeof(a));
const int N=2e5+10;
int main(){
//#define io
#ifdef io
freopen("in.txt","r",stdin);
#endif
ios::sync_with_stdio(0);
int n;
cin>>n;
ll s=0,pos=-1,ans=0;
mp[0]=0;
for(int i=1;i<=n;i++){
ll x;
cin>>x;
s+=x;
if(mp.count(s)) pos=max(pos,mp[s]);
ans+=i-pos-1;
mp[s]=i;
}
cout<<ans<<endl;
return 0;
}