金题大战Vol.0 A、凉宫春日的叹息
金题大战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、凉宫春日的叹息的更多相关文章
- 金题大战Vol.0 B、序列
金题大战Vol.0 B.序列 题目描述 给定两个长度为 \(n\) 的序列\(a\), \(b\). 你需要选择一个区间\([l,r]\),使得\(a_l+-+a_r>=0\)且\(b_l+-+ ...
- 金题大战Vol.0 C、树上的等差数列
金题大战Vol.0 C.树上的等差数列 题目描述 给定一棵包含\(N\)个节点的无根树,节点编号\(1-N\).其中每个节点都具有一个权值,第\(i\)个节点的权值是\(A_i\). 小\(Hi\)希 ...
- 土题大战Vol.0 A. 笨小猴 思维好题
土题大战Vol.0 A. 笨小猴 思维好题 题目描述 驴蛋蛋有 \(2n + 1\) 张 \(4\) 星武器卡片,每张卡片上都有两个数字,第 \(i\) 张卡片上的两个数字分别是 \(A_i\) 与 ...
- 火题大战Vol.0 B 计数DP
火题大战Vol.0 B 题目描述 \(n\) 个沙茶,被编号 \(1\)~$ n$.排完队之后,每个沙茶希望,自己的相邻的两人只要无一个人的编号和自己的编号相差为 \(1\)(\(+1\) 或\(-1 ...
- 水题大战Vol.3 B. DP搬运工2
水题大战Vol.3 B. DP搬运工2 题目描述 给你\(n,K\),求有多少个\(1\)到\(n\) 的排列,恰好有\(K\)个数\(i\) 满足\(a_{i-1},a_{i+1}\) 都小于\(a ...
- 火题大战Vol.1 A.
火题大战Vol.1 A. 题目描述 给定两个数\(x\),\(y\),比较\(x^y\) 与\(y!\)的大小. 输入格式 第一行一个整数\(T\)表示数据组数. 接下来\(T\)行,每行两个整数\( ...
- [火星补锅] 水题大战Vol.2 T2 && luogu P3623 [APIO2008]免费道路 题解
前言: 如果我自己写的话,或许能想出来正解,但是多半会因为整不出正确性而弃掉. 解析: 这题算是对Kruskal的熟练运用吧. 要求一颗生成树.也就是说,最后的边数是确定的. 首先我们容易想到一个策略 ...
- [火星补锅] 水题大战Vol.2 T1 && luogu P1904 天际线 题解 (线段树)
前言: 当时考场上并没有想出来...后来也是看了题解才明白 解析: 大家(除了我)都知道,奇点和偶点会成对出现,而出现的前提就是建筑的高度突然发生变化.(这个性质挺重要的,我之前没看出来) 所以就可以 ...
- MathExam小学一二年级计算题生成器V1.0
MathExam小学一二年级计算题生成器v1.0 一.预估与实际 PSP2.1 Personal Software Process Stages 预估耗时(分钟) 实际耗时(分钟) Planning ...
随机推荐
- Java中goto标签的使用
编写此文仅为以后可以复习. 最近在自学Java核心技术(很好的书,推荐!!),也是第一次从上面了解了goto,或许只是浅层了解. 错误之处希望大佬们给予批评与建议!!谢谢!!! Java核心技术中就提 ...
- 【requests库】七个主要方法
本文主要介绍requests库访问http的七个主要方法:get.head.post.put.patch.delete. requests.get()方法 get方法用于获取指定url的HTML网页, ...
- three.js 数学方法之Matrix3
今天郭先生来说一说three.js的三维矩阵,这块知识需要结合线性代数的一些知识,毕业时间有点长,线性代数的知识大部分都还给了老师.于是一起简单的复习了一下.所有的计算都是使用列优先顺序进行的.然而, ...
- APP自动化 -- swipe(滑动屏幕)
- I 2 C、 SPI、 USB驱动架构
根据图12.4, Linux倾向于将主机端的驱动与外设端的驱动分离, 而通过一个核心层将某种总线的协议进行抽象, 外设端的驱动调用核心层API间接过渡到对主机驱动传输函数的调用. 对于I 2 C. S ...
- vue学习(二) 三个指令v-cloak v-text v-html
//style <style> [v-cloak]{ display:none } </style> //html <div id="app"> ...
- Java 异常处理专题,从入门到精通
内置异常和Throwable核心方法 Java内置异常 可查异常(必须要在方法里面捕获或者抛出) ClassNoFoundException 应⽤程序试图加载类,找不到对应的类 IllegalAcce ...
- nginx访问日志分析,筛选时间大于1秒的请求
处理nginx访问日志,筛选时间大于1秒的请求 #!/usr/bin/env python ''' 处理访问日志,筛选时间大于1秒的请求 ''' with open('test.log','a+' ...
- 微服务迁移记(五):WEB层搭建(1)
WEB层是最终表现层,注册至注册中心,引用接口层(不需要引用实现层).公共服务层.用户登录使用SpringSecurity,Session保存在redis中,权限管理没有用SpringSecurity ...
- luogu P6583 回首过去 简单数论变换 简单容斥
LINK:回首过去 考试的时候没推出来 原因:状态真的很差 以及 数论方面的 我甚至连除数分块都给忘了. 手玩几个数据 可以发现 \(\frac{x}{y}\)满足题目中的条件当且仅当 这个是一个既约 ...