金题大战Vol.0 A、凉宫春日的叹息

题目描述

给定一个数组,将其所有子区间的和从小到大排序,求第 \(k\) 小的是多少。

输入格式

第一行两个数\(n\),$ k\(,表示数组的长度和\)k$;

第二行有 \(n\) 个数,第\(i\)个是\(a[i]\),表示给定的数组。

输出格式

仅一个数,表示答案。

样例

样例输入1

5 6

1 1 1 1 1

样例输出1

2

样例输入2

8 20

2 3 1 2 5 3 2 3

样例输出2

8

数据范围与提示

对于\(15\%\)的数据,\(n \leq 1000\)

对于\(30\%\)的数据,\(n \leq 5000\)

对于\(50\%\)的数据,\(n,k \leq 10^5\)

对于\(70\%\)的数据,\(n\leq 10^5\)

对于\(100\%\)的数据,\(n\leq 10^6,1 \leq a[i],k \leq 10^9\)

分析

首先,这一道\(k\)的范围很大,因此我们肯定不可以把前\(k\)小的都求出来

所以我们只能换一种思路

我们观察一下数据范围,发现 \(n\) 只有 \(10^6\),而时限是 \(2s\)

似乎 \(n log n\) 的算法就可以过

于是我们就尝试二分枚举一个数,判断它能不能作为第 \(k\) 小的值

然后又会发现因为前缀和是单调递增的,所以就可以用双指针搞一下

这样每一次判断的复杂度就降低到了 \(O(n)\)

代码

#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<algorithm>
using namespace std;
const int maxn=1e6+5;
typedef long long ll;
inline ll read(){
ll x=0,f=1;
char ch=getchar();
while(ch<'0' || ch>'9'){
if(ch=='-') f=-1;
ch=getchar();
}
while(ch>='0' && ch<='9'){
x=(x<<1LL)+(x<<3LL)+(ch^48);
ch=getchar();
}
return x*f;
}
ll n,k,a[maxn],q[maxn],sum[maxn];
bool jud(ll now){
memset(q,0,sizeof(q));
ll head=1,tail=0,ans=0;
for(ll i=1;i<=n;i++){
while(head<=tail && sum[i]-sum[q[head]-1]>now) head++;
q[++tail]=i;
if(sum[i]-sum[q[head]-1]<=now)ans+=(i-q[head]+1);
}
return ans>=k;
}
int main(){
freopen("A.in","r",stdin);
freopen("A.out","w",stdout);
n=read(),k=read();
ll mmin=0x3f3f3f3f3f3f3f3f;
for(ll i=1;i<=n;i++){
a[i]=read();
mmin=min(mmin,a[i]);
sum[i]=sum[i-1]+a[i]*1LL;
}
ll l=mmin,r=sum[n],mids;
while(l<=r){
mids=(l+r)/2;
if(jud(mids)) r=mids-1;
else l=mids+1;
}
printf("%lld\n",l);
return 0;
}

金题大战Vol.0 A、凉宫春日的叹息的更多相关文章

  1. 金题大战Vol.0 B、序列

    金题大战Vol.0 B.序列 题目描述 给定两个长度为 \(n\) 的序列\(a\), \(b\). 你需要选择一个区间\([l,r]\),使得\(a_l+-+a_r>=0\)且\(b_l+-+ ...

  2. 金题大战Vol.0 C、树上的等差数列

    金题大战Vol.0 C.树上的等差数列 题目描述 给定一棵包含\(N\)个节点的无根树,节点编号\(1-N\).其中每个节点都具有一个权值,第\(i\)个节点的权值是\(A_i\). 小\(Hi\)希 ...

  3. 土题大战Vol.0 A. 笨小猴 思维好题

    土题大战Vol.0 A. 笨小猴 思维好题 题目描述 驴蛋蛋有 \(2n + 1\) 张 \(4\) 星武器卡片,每张卡片上都有两个数字,第 \(i\) 张卡片上的两个数字分别是 \(A_i\) 与 ...

  4. 火题大战Vol.0 B 计数DP

    火题大战Vol.0 B 题目描述 \(n\) 个沙茶,被编号 \(1\)~$ n$.排完队之后,每个沙茶希望,自己的相邻的两人只要无一个人的编号和自己的编号相差为 \(1\)(\(+1\) 或\(-1 ...

  5. 水题大战Vol.3 B. DP搬运工2

    水题大战Vol.3 B. DP搬运工2 题目描述 给你\(n,K\),求有多少个\(1\)到\(n\) 的排列,恰好有\(K\)个数\(i\) 满足\(a_{i-1},a_{i+1}\) 都小于\(a ...

  6. 火题大战Vol.1 A.

    火题大战Vol.1 A. 题目描述 给定两个数\(x\),\(y\),比较\(x^y\) 与\(y!\)的大小. 输入格式 第一行一个整数\(T\)表示数据组数. 接下来\(T\)行,每行两个整数\( ...

  7. [火星补锅] 水题大战Vol.2 T2 && luogu P3623 [APIO2008]免费道路 题解

    前言: 如果我自己写的话,或许能想出来正解,但是多半会因为整不出正确性而弃掉. 解析: 这题算是对Kruskal的熟练运用吧. 要求一颗生成树.也就是说,最后的边数是确定的. 首先我们容易想到一个策略 ...

  8. [火星补锅] 水题大战Vol.2 T1 && luogu P1904 天际线 题解 (线段树)

    前言: 当时考场上并没有想出来...后来也是看了题解才明白 解析: 大家(除了我)都知道,奇点和偶点会成对出现,而出现的前提就是建筑的高度突然发生变化.(这个性质挺重要的,我之前没看出来) 所以就可以 ...

  9. MathExam小学一二年级计算题生成器V1.0

    MathExam小学一二年级计算题生成器v1.0 一.预估与实际 PSP2.1 Personal Software Process Stages 预估耗时(分钟) 实际耗时(分钟) Planning ...

随机推荐

  1. TestNg失败重跑—解决使用 dataProvider 参数化用例次数冲突问题

    问题背景 在使用 testng 执行 UI 自动化用例时,由于 UI自动化的不稳定性,我们在测试的时候,往往会加上失败重跑机制.在不使用 @DataProvider 提供用例参数化时,是不会有什么问题 ...

  2. Just test it!!软件测试测起来!!

    (图片: josh@unsplash,字数:700,时间:1分钟) (一) 一切的软件质量保障活动,归根结底,就两种类型. 一种是基于代码执行的,一种是不基于代码执行的. 测试之于肉眼自查.静态检查. ...

  3. flask中的endpoint是什么

    app.view_functions 是一个字典,里面是存储的是 endpoint 与 视图函数的键值对,如果没指名函数视图的endpoint,默认是函数名,而 url_map 是一个列表,里面是ur ...

  4. nginx访问日志分析,筛选时间大于1秒的请求

    处理nginx访问日志,筛选时间大于1秒的请求   #!/usr/bin/env python ''' 处理访问日志,筛选时间大于1秒的请求 ''' with open('test.log','a+' ...

  5. PHP fclose() 函数

    定义和用法 fclose() 函数关闭打开的文件. 该函数如果成功则返回 TRUE,如果失败则返回 FALSE. 语法 fclose(file) 参数 描述 file 必需.规定要关闭的文件. 实例 ...

  6. PHP imagechar - 写出横向字符

    imagechar — 写出横向的字符.高佣联盟 www.cgewang.com 语法 bool imagechar ( resource $image , int $font , int $x , ...

  7. JS 常用方法汇总(不定期更新)

    /** * 获取当前日期 * @returns {string} */ Common.currentDate = function () { // 获取当前日期 var date = new Date ...

  8. electron开发 - mac平台的打包和签名 - 针对electron-builder的自动更新

    配合自动更新 - 安装包签名(mac)(待补充) 前提:实现自动更新需要签名 一.本地开发调试mac签名(无需具有权限的appple账号) 打开xcode,xcode -> preference ...

  9. RabbitMQ好文章推荐

    文章来源:掘金    作者:申城异乡人 RabbitMQ使用教程(一)RabbitMQ环境安装配置及Hello World示例     https://juejin.im/post/5ce644b9f ...

  10. MySQL主从同步-原理&实践篇

    来源:Onegoleya 简栈文化 什么是mysql的主从复制? MySQL 主从复制是指数据可以从一个MySQL数据库服务器主节点复制到一个或多个从节点.MySQL 默认采用异步复制方式,这样从节点 ...