首页 > 代码库 > [51nod1094]和为k的连续区间

[51nod1094]和为k的连续区间

法一:暴力$O({n^2})$看脸过

 1 #include<bits/stdc++.h> 2 using namespace std; 3 typedef long long ll; 4 int a[50002],sum[50002]; 5 int main(){ 6     int n,k; 7     cin>>n>>k; 8     for(int i=1;i<=n;i++){ cin>>a[i];sum[i]=sum[i-1]+a[i];}  9     bool flag=false;10     for(int i=0;i<n;i++){11         for(int j=i+1;j<=n;j++){12             if(sum[j]-sum[i]==k){13                 cout<<i+1<<" "<<j<<endl;14                 flag=true;15                 break;16             }17         }18         if(flag) break;19     }20     if(!flag) cout<<"No Solution\n";21     return 0;22 }

法二:map优化,存储sum数组的下标,复杂度$O(n\log n)$

 

 1 #include<bits/stdc++.h> 2 using namespace std; 3 typedef long long ll; 4 ll a[50002],s[50002]; 5 int main(){ 6     map<ll,int>m; 7     ll n,k; 8     cin>>n>>k; 9     for(ll i=1;i<=n;i++){ cin>>a[i];s[i]=s[i-1]+a[i];}10     for(ll i=n;i>=1;i--) m[s[i]]=i;11     bool ok=false;12     ll l,r;13     m[0]=0;14     for(ll i=1;i<=n;i++){15         16         if(s[i]-k==0&&!ok) l=1,r=i,ok=true; 17         18         else if(m[s[i]-k]){19             if(m[s[i]-k]+1>i) continue;20             if(!ok) l=m[s[i]-k]+1,r=i,ok=true;21             else{22                 if(m[s[i]-k]+1<l) l=m[s[i]-k]+1,r=i;23                 else if(m[s[i]-k]+1==l) r=min(r,i);24             }25         }26     }27     if(!ok) cout<<"No Solution\n";28     else cout<<l<<" "<<r<<endl;29 30     return 0;31 }

法三:据说二分可以做?

 

[51nod1094]和为k的连续区间