法一:暴力$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. Kindeditor 函数用途

    1.loadScript  加载文件   2.updateState 更新工具条状态   afterCreate在dom加载的时候执行,dom加载完之前执行的 K.ready dom加载完之后执行   ...

  2. 构造代码块、构造函数、this执行顺序

    一.构造函数 对象一建立就会调用与之对应的构造函数. 构造函数的作用:可以用于给对象进行初始化. 构造函数的小细节:当一个类中没有定义构造函数时,系统会默认给该类加一个空参数的构造函数:当在类中自定义 ...

  3. IAR 条件断点

    条件断点是IDE的一个重要功能,在IAR调试时候,经常跟踪一个数据,但是对较大的buffer,用普通的断点或live watch都不好跟踪. 比如某个buffer里一个数,我们知道他在第几个,但是却从 ...

  4. HTTP1.1与HTTP1.0

    本文转载自: http://www.cnblogs.com/shijingxiang/articles/4434643.html 1.可扩展性 a.在消息中增添版本号,用于兼容判断,版本号只能判断逐段 ...

  5. scikit-learn笔记之初次接触

    一.加载数据: 然后看一下有多少个特征和类别以及它们的名字: 二.数据可视化:: 由于该套数据集有4个特征,所以只能选取2个特征进行显示. 可见红色和绿色的点混在一起,所以再选择其他特征作为坐标轴: ...

  6. delphi各个版本编译开关值

    delphi各个版本编译开关值 {$IFDEF VER80}  - Delphi 1{$IFDEF VER90}  - Delphi 2{$IFDEF VER100} - Delphi 3{$IFDE ...

  7. UOJ278 【UTR #2】题目排列顺序

    本文作者:ljh2000 作者博客:http://www.cnblogs.com/ljh2000-jump/转载请注明出处,侵权必究,保留最终解释权!   题目链接: http://uoj.ac/co ...

  8. Hive- Hive 的基本操作

    创建数据库 create database db_hive; use db_hive; create database if not exists db_hive_02; create databas ...

  9. Javascript 模块化编程 --RequireJs

    什么是模块化 模块就是实现特定功能的一组方法,常见的几种js写法 原始写法 function A() { } function B() { } 上面函数A()和B()组成一个模块,使用的时候直接调用就 ...

  10. linux应用之make命令详解

    从源代码安装过软件的朋友一定对 ./configure && make && make install 安装三步曲非常熟悉了.然而究竟这个过程中的每一步幕后都发生了些什 ...