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

 #include<bits/stdc++.h>
using namespace std;
typedef long long ll;
int a[],sum[];
int main(){
int n,k;
cin>>n>>k;
for(int i=;i<=n;i++){ cin>>a[i];sum[i]=sum[i-]+a[i];}
bool flag=false;
for(int i=;i<n;i++){
for(int j=i+;j<=n;j++){
if(sum[j]-sum[i]==k){
cout<<i+<<" "<<j<<endl;
flag=true;
break;
}
}
if(flag) break;
}
if(!flag) cout<<"No Solution\n";
return ;
}

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

 #include<bits/stdc++.h>
using namespace std;
typedef long long ll;
ll a[],s[];
int main(){
map<ll,int>m;
ll n,k;
cin>>n>>k;
for(ll i=;i<=n;i++){ cin>>a[i];s[i]=s[i-]+a[i];}
for(ll i=n;i>=;i--) m[s[i]]=i;
bool ok=false;
ll l,r;
m[]=;
for(ll i=;i<=n;i++){ if(s[i]-k==&&!ok) l=,r=i,ok=true; else if(m[s[i]-k]){
if(m[s[i]-k]+>i) continue;
if(!ok) l=m[s[i]-k]+,r=i,ok=true;
else{
if(m[s[i]-k]+<l) l=m[s[i]-k]+,r=i;
else if(m[s[i]-k]+==l) r=min(r,i);
}
}
}
if(!ok) cout<<"No Solution\n";
else cout<<l<<" "<<r<<endl; return ;
}

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

 #include<bits/stdc++.h>
using namespace std;
typedef long long ll;
struct node{
ll sum,idx;
}a[];
ll b[];
ll n,k;
bool cmp(node &a,node &b){
return (a.sum<b.sum)||(a.sum==b.sum&&a.idx<b.idx);
}
ll erfen(int p,int id){
ll l=,r=n;
while(l<r){
ll mid=(l+r)>>;
if(a[mid].sum>=p) r=mid;
else l=mid+;
}
return r;
}
int main(){
cin>>n>>k;
for(ll i=;i<=n;i++){
cin>>a[i].sum;
a[i].sum+=a[i-].sum;
a[i].idx=i;
b[i]=a[i].sum;
}
bool flag=false;
sort(a+,a+n+,cmp);
for(ll i=;i<=n;i++){
ll p=b[i-]+k;
ll idx=erfen(p,i);
while(a[idx].idx<i) idx++;
if(a[idx].sum==p){
cout<<i<<" "<<a[idx].idx<<endl;
flag=true;
break;
}
}
if(!flag) cout<<"No Solution\n";
return ; }

[51nod1094]和为k的连续区间的更多相关文章

  1. 51nod 1094 和为k的连续区间【前缀和/区间差/map】

    1094 和为k的连续区间 基准时间限制:1 秒 空间限制:131072 KB 分值: 10 难度:2级算法题  收藏  关注 一整数数列a1, a2, ... , an(有正有负),以及另一个整数k ...

  2. 1094 和为k的连续区间(暴力)

    基准时间限制:1 秒 空间限制:131072 KB 分值: 10 难度:2级算法题 收藏 关注 一整数数列a1, a2, ... , an(有正有负),以及另一个整数k,求一个区间[i, j],(1 ...

  3. 51Nod 1094 和为k的连续区间 | 水

    Input示例 6 10 1 2 3 4 5 6 Output示例 1 4 #include "cstdio" #include "algorithm" #in ...

  4. 区间sum 和为k的连续区间-前缀和

    区间sum 描述 有一个长度为n的正整数序列a1--an,candy想知道任意区间[L,R]的和,你能告诉他吗? 输入 第一行一个正整数n(0<n<=1e6),第二行为长度为n的正整数序列 ...

  5. 51Nod 1094 和为k的连续区间

    #include <iostream> #include <algorithm> #include <cstring> using namespace std; t ...

  6. 51Nod 和为k的连续区间

    一整数数列a1, a2, ... , an(有正有负),以及另一个整数k,求一个区间[i, j],(1 <= i <= j <= n),使得a[i] + ... + a[j] = k ...

  7. [BZOJ 1112] [POI2008] 砖块Klo 【区间K大】

    题目链接:BZOJ - 1112 题目分析 枚举每一个长度为k的连续区间,求出这个区间的最优答案,更新全局答案. 可以发现,这个区间的所有柱子最终都变成这k个数的中位数时最优,那么我们就需要查询这个区 ...

  8. codeforce-191E-Thwarting Demonstrations(树状数组+二分+离散)

    题意: 求第K 大连续区间 分析: 二分答案,再n * log(n)判断有几个区间的区间和大于mid,然后调整上下界,使这个值不断的接近k. 判断符合条件的区间总数:线性扫描sum[n](前n项和) ...

  9. UVALive 8519 Arrangement for Contests 2017西安区域赛H 贪心+线段树优化

    题意 等价于给一个数列,每次对一个长度为$K$的连续区间减一 为最多操作多少次 题解: 看样例猜的贪心,10分钟敲了个线段树就交了... 从1开始,找$[i,i+K]$区间的最小值,然后区间减去最小值 ...

随机推荐

  1. 图片oom问题

    1.什么是OOM? 程序申请内存过大,虚拟机无法满足我们,然后自杀了.这个现象通常出现在大图片的APP开发,或者需要用到很多图片的时候.通俗来讲就是我们的APP需要申请一块内存来存放图片的时候,系统认 ...

  2. Flex中容器的完全隐藏

    在html中,但我们设置某个dom元素的display属性为none时,dom元素不可见且其占用空间从dom树上隐藏,而在Flex中,但我们把某个组件的visible属性visible设为false的 ...

  3. centos 6.5 编译安装了 Nginx1.6.0+MySQL5.6.19+PHP5.5.14

    centos 6.5 编译安装了 Nginx1.6.0+MySQL5.6.19+PHP5.5.14--------------------------------------------------- ...

  4. iOS9 - 采用3D Touch

    iPhone 6s/6s Plus提供了触摸屏的另一个维度的操作手势-3D Touch,通常有下面两种应用场景: 在主屏幕上重按APP图标可以提供进入APP特定功能的快捷菜单 在APP内部,可以通过重 ...

  5. JavaScript 从对象 new 说起,简单理解 this/call/apply

    new  创建一个新对象: 将构造函数的作用域赋给新对象(因此this就指向了这个新对象): 执行构造函数中的代码(为这个新对象添加属性): 返回新对象 用代码描述的话(先别管proyotype, a ...

  6. 【Flask模板】include标签

    # include标签:1. 这个标签相当于是直接将指定的模版中的代码复制粘贴到当前位置.2. `include`标签,如果想要使用父模版中的变量,直接用就可以了,不需要使用`with context ...

  7. Group By 和 Having, Where ,Order by执行顺序

    1.Group By 和 Having, Where ,Order by这些关键字是按照如下顺序进行执行的:Where, Group By, Having, Order by. 首先where将最原始 ...

  8. Java 9 逆天的十大新特性

    在介绍java9之前,我们先来看看java成立到现在的所有版本. 1990年初,最初被命名为Oak: 1995年5月23日,Java语言诞生: 1996年1月,第一个JDK-JDK1.0诞生: 199 ...

  9. MAC下ssh免密码登录远程服务器

    生成密钥.在终端下执行命令: ssh-keygen -t rsa 一路回车,各种提示按默认不要改,等待执行完毕.然后执行: ls ~/.ssh #可以看到两个密钥文件:id_rsa(私钥) id_rs ...

  10. 算法(Algorithms)第4版 练习 1.5.23

    package com.qiusongde; import edu.princeton.cs.algs4.StdOut; public class Exercise1523 { public stat ...