• [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
    ";
    21     return 0;
    22 }

    法二:map优化,存储sum数组的下标,复杂度$O(nlog 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
    ";
    28     else cout<<l<<" "<<r<<endl;
    29 
    30     return 0;
    31 }

    法三:二分复杂度$O(nlog n)$,特别注意二分时的判断条件,很容易出错,idx和sum不可以一起判断,只能判断完sum,再独自判断idx,否则答案会出错

     1 #include<bits/stdc++.h>
     2 using namespace std;
     3 typedef long long ll;
     4 struct node{
     5     ll sum,idx;
     6 }a[10002];
     7 ll b[10002];
     8 ll n,k;
     9 bool cmp(node &a,node &b){
    10     return (a.sum<b.sum)||(a.sum==b.sum&&a.idx<b.idx);
    11 }
    12 ll erfen(int p,int id){
    13     ll l=1,r=n;
    14     while(l<r){
    15         ll mid=(l+r)>>1;
    16         if(a[mid].sum>=p) r=mid;
    17         else l=mid+1;
    18     }
    19     return r;
    20 } 
    21 int main(){
    22     cin>>n>>k;
    23     for(ll i=1;i<=n;i++){
    24         cin>>a[i].sum;
    25         a[i].sum+=a[i-1].sum;
    26         a[i].idx=i;
    27         b[i]=a[i].sum;
    28     }
    29     bool flag=false;
    30     sort(a+1,a+n+1,cmp);
    31     for(ll i=1;i<=n;i++){
    32         ll p=b[i-1]+k;
    33         ll idx=erfen(p,i);
    34         while(a[idx].idx<i) idx++; 
    35         if(a[idx].sum==p){
    36             cout<<i<<" "<<a[idx].idx<<endl;
    37             flag=true;
    38             break;
    39         }
    40     }
    41     if(!flag) cout<<"No Solution
    ";
    42     return 0;
    43     
    44 } 
  • 相关阅读:
    配置ssh免密登录
    idea打开项目定位到选择项目的位置
    MySQL decimal、numeric数据类型介绍
    C++ string::size_type类型
    Java Oracle存储过程问题
    PLSQL Developer简单使用教程
    ed2k如何下载
    老毛桃U盘启动盘制作工具安装教程
    Hibernate current_session_context_class的事务说明
    java openSession和getCurrentSession的比较
  • 原文地址:https://www.cnblogs.com/elpsycongroo/p/6918721.html
Copyright © 2020-2023  润新知