法一:暴力$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. 每天一个Linux命令(32)date命令

          date命令是显示或设置系统时间与日期.        (1)用法:       用法:  date [选项]  [参数]       (2)功能:       功能:  根据指定格式显示 ...

  2. Data Structure Binary Tree: Populate Inorder Successor for all nodes

    http://www.geeksforgeeks.org/populate-inorder-successor-for-all-nodes/ #include <iostream> #in ...

  3. Python核心编程课后习题-第六章

    1. 字符串, string模块中是否有一种字符串方法或者函数可以帮我鉴定一下一个字符串是否是另一个大字符串的一部分? str1 = 'abcdefghijklmnopqrstuv' print st ...

  4. 95th percentile concentration

    很多网络流量监控软件都提供了一个95th的值,开始一直不太理解,终于在solarwinds官网找到答案. 95th百分点指的是所给数集中超过其95%的数.它是一个统计学上的概念.对于某个接口,准确统计 ...

  5. Docker 架构篇

    Docker 的核心组件包括: Docker 客户端 - Client Docker 服务器 - Docker daemon Docker 镜像 - Image Registry Docker 容器 ...

  6. 常用CSS设置

    主要内容: 一.容器类 二.文本类 三.特效类 一.容器类 1.background-image:url('img/02.gif');   设置背景图(可以是动态图) 2.background-col ...

  7. 关于HttpURLConnection测试servlet

    把数据POST给服务端后,一定要读取服务端的响应,这是必须的,否则服务端不处理.其实发送的数据被服务端接收后在缓冲中,并不是立即处理的.然后服务端把响应码和内容等反回给客户端.如果客户端只发送不接受, ...

  8. Codeforces 245H Queries for Number of Palindromes:区间dp

    题目链接:http://codeforces.com/problemset/problem/245/H 题意: 给你一个字符串s. 然后有t个询问,每个询问给出x,y,问你区间[x,y]中的回文子串的 ...

  9. jquery的ajax(err)

    load()方法 load()方法是jquery中最为简单和常用的ajax方法. 直接使用ajax技术的流程 1.创建xmlhttprequest对象 2.调用open函数("提交方式&qu ...

  10. Android 基础-2.0 拔打电话号码

    1.添加权限 在AndroidManifest.xml 添加打电话权限 <uses-permission android:name="android.permission.CALL_P ...