金题大战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 ...
随机推荐
- 阿里P9又有新瓜吃咯,马云震怒!!
自从蒋凡出轨事件曝光之后,阿里这各种瓜来得就像龙卷风,隔三差五的爆出员工出轨事件,普通员工.中层.高管全覆盖,早已集齐7颗阿里瓜瓜,可以召唤神龙了. 上次的出轨事件过去还没有一个月的时间,今天又爆出来 ...
- 题解 CF585F 【Digits of Number Pi】
考虑用数位 \(DP\) 来统计数字串个数,用 \(SAM\) 来实现子串的匹配. 设状态 \(f(pos,cur,lenth,lim,flag)\),表示数位的位数,在 \(SAM\) 上的节点,匹 ...
- jspang 做个那个pos系统--学习笔记
/为什么不能使用Object.assign() //使用Object.assign之后数据会发生改变,但是试图没有跟新 <template> <div class="pos ...
- Nginx(一)Linux上的Nginx安装步骤
一.Windows下安装 解压:nginx-windows 双击: nginx.exe 能看到nginx欢迎界面说明,nginx安装成功 演示下 nginx做静态服务器 二.Linux下安装 (1). ...
- 微服务迁移记(五):WEB层搭建(4)-简单的权限管理
一.redis搭建 二.WEB层主要依赖包 三.FeignClient通用接口 以上三项,参考<微服务迁移记(五):WEB层搭建(1)> 四.SpringSecurity集成 参考:< ...
- abp框架Excel导出——基于vue
abp框架Excel导出--基于vue 目录 abp框架Excel导出--基于vue 1.技术栈 1.1 前端采用vue,官方提供 1.2 后台是abp--aspnetboilerplate 2. E ...
- Python实现数据结构 图
邻接矩阵 class Vertex: def __init__(self, node): self.id = node # Mark all nodes unvisited self.visited ...
- PHP hypot() 函数
实例 计算不同的直角三角形的斜边长度: <?phpecho hypot(3,4) . "<br>";echo hypot(4,6) . "<br& ...
- C/C++编程笔记:C语言成绩管理系统!链式结构的管理系统源码分享
最近很多同学因为学校的要求,需要完成自己的那个C语言课程设计,于是就有很多人私信或者加我私聊我,问的最多的还是<学生成绩管理系统>,其实当你项目写多了你就会发现:其实各类的管理系统都离不开 ...
- 深入了解Redis(1)-字符串底层实现
一.简单动态字符串(SDS) Redis中字符串实现有两种方式,C语言传统字符串(以空字符结尾的字符数组)和简单动态字符串(SDS),并将SDS作为默认字符串表示. C字符串只会作为字符串字面量,用在 ...