其他分享
首页 > 其他分享> > Codeforces Round #632 (Div. 2) C. Eugene and an array

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