Codeforces Round #632 (Div. 2) C. Eugene and an array
作者:互联网
题目链接:https://codeforc.es/contest/1333/problem/C
题意:给定一个数组,问有多少个连续子数组满足 是好数组 一个数组中的任意连续子数组和都不为0的数组为好数组
思路: 考虑到 每个子数组可以通过 起点和长度来确定, 那么就枚举每个起点, 在找到前面第一个不符合的状态
要记录数组和的状态 就要用前缀和, sum[i]-sum[j-1] ==0 的时候 就说明j~i 这一段是不符合好数组的
那么记录每个sum 的最近的位置即可 当然要注意要用 一个 max1来维护,因为 中间有一部分为0的话,就不能到前面了
如 前缀和 1 2 2 1 此时 中间的22 就已经不满足了
处理的时候 要注意一下边界的问题, 可以让i=2 开始 更好的处理
1 #include<bits/stdc++.h> 2 using namespace std; 3 #define ll long long 4 #define ull unsigned long long 5 #define pb push_back 6 const int maxn=2e5+10; 7 const int mod=1e9+7; 8 ll a[maxn]; 9 10 11 int main() 12 { 13 ios::sync_with_stdio(false); 14 cin.tie(0); 15 int n; 16 cin>>n; 17 for(int i=2;i<=n+1;i++) 18 { 19 cin>>a[i]; 20 } 21 map<ll,ll>mp; 22 ll sum=0; 23 ll ans=0; 24 ll max1=0; 25 mp[0]=1; 26 for(int i=2;i<=n+1;i++) 27 { 28 sum+=a[i]; 29 max1=max(max1,mp[sum]); 30 int temp=i-max1-1; 31 ans+=temp; 32 mp[sum]=i; 33 34 } 35 cout<<ans<<'\n'; 36 37 38 39 40 }View Code
正常i=1开始的处理
1 #include<bits/stdc++.h> 2 using namespace std; 3 #define ll long long 4 #define ull unsigned long long 5 #define pb push_back 6 const int maxn=2e5+10; 7 const int mod=1e9+7; 8 ll a[maxn]; 9 10 11 int main() 12 { 13 ios::sync_with_stdio(false); 14 cin.tie(0); 15 int n; 16 cin>>n; 17 for(int i=1;i<=n;i++) 18 { 19 cin>>a[i]; 20 } 21 map<ll,ll>mp; 22 ll sum=0; 23 ll ans=0; 24 ll max1=0; 25 mp[0]=1; 26 for(int i=1;i<=n;i++) 27 { 28 sum+=a[i]; 29 max1=max(max1,mp[sum]); 30 int temp=i-max1; 31 /*if(max1==0&&sum!=0) 32 temp++;*/ 33 ans+=temp; 34 mp[sum]=i+1; 35 } 36 cout<<ans<<'\n'; 37 38 39 40 41 }View Code
错误的处理
1 #include<bits/stdc++.h> 2 using namespace std; 3 #define ll long long 4 #define ull unsigned long long 5 #define pb push_back 6 const int maxn=2e5+10; 7 const int mod=1e9+7; 8 ll a[maxn]; 9 10 11 int main() 12 { 13 ios::sync_with_stdio(false); 14 cin.tie(0); 15 int n; 16 cin>>n; 17 for(int i=1;i<=n;i++) 18 { 19 cin>>a[i]; 20 } 21 map<ll,ll>mp; 22 ll sum=0; 23 ll ans=0; 24 ll max1=0; 25 for(int i=1;i<=n;i++) 26 { 27 sum+=a[i]; 28 max1=max(max1,mp[sum]); 29 int temp=i-max1-1; 30 if(max1==0&&sum!=0) 31 temp++; 32 ans+=temp; 33 mp[sum]=i; 34 35 36 } 37 cout<<ans<<'\n'; 38 39 40 41 42 }View Code
只是单独考虑的0的时候-1 没有考虑到0的位置对后面的影响 如前缀和 0 2 3 4 0 5
标签:632,const,int,ll,Codeforces,long,数组,Round,define 来源: https://www.cnblogs.com/winfor/p/13512113.html