金题大战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. 大厂0距离:网易 Linux 运维工程师面试真题,内含答案

    作为 Linux 运维工程师,进入大公司是开启职业新起点的关键,今天马哥 linux 运维及云计算智囊团的小伙伴特别分享了其在网易面试 Linux 运维及云计算工程师的题目和经历,希望对广大 Linu ...

  2. python基础--闭包、装饰器

    装饰器的详细使用 (1)小知识点补充 在这里我们先学一个简单的知识点. li = ['alex', '银角', '女神', 'egon', '太白'] for i in enumerate(li): ...

  3. 深入探究JVM之垃圾回收算法实现细节

    @ 目录 前言 垃圾回收算法实现细节 根节点枚举 安全点 安全区域 记忆集和卡表 写屏障 并发的可达性分析 低延迟GC Shenandoah ZGC 总结 前言 本篇紧接上文,主要讲解垃圾回收算法的实 ...

  4. SpringSecurity匹配规则介绍

    SpringSecurity匹配规则一 URL匹配 requestMatchers() 配置一个request Mather数组,参数为RequestMatcher 对象,其match 规则自定义,需 ...

  5. PHP mb_substr() 函数

    实例 从字符串中返回 "菜鸟": <?php echo mb_substr("菜鸟教程", 0, 2); // 输出:菜鸟 ?> 定义和用法 mb_ ...

  6. Skill 脚本演示 ycAutoSnap.skl

    https://www.cnblogs.com/yeungchie/ ycAutoSnap.skl 版图编辑中自动吸附 Path 的 "垂直线头",也可以批量对齐 Bus 走线,也 ...

  7. P2489 [SDOI2011]迷宫探险 概率dp

    LINK:迷宫探险 题目中要求在最优的策略下的最大概率 而并非期望概率. 一个坑点 题目中虽然没有明说 但是 探险者是知道地图的模样和每个陷阱的概率的. 所以才有最优策略一说. 最优策略尽管不知道可以 ...

  8. 解决痛苦的方法/cy

    这篇文章 源于我所有痛苦的回忆. 由于痛苦太多了 体会完了 所以 觉得这些都不算是什么大问题了 所以 这里 是解决痛苦的方法. 真的很痛苦的话 可以这样 对着全班人喊你们 都没我强 因为 你们都没有我 ...

  9. 集合框架-HashMap&HashSet&LinkedHshMap

    一.HashMap的底层实现 HashMap底层是基于数组和链表实现的.其中最重要的参数:容量和负载因子. 容量的默认大小事16,负载因子是0.75,当HashMap的size>16*0.75的 ...

  10. 用大白话解释什么是Socket

    好好学习,天天向上 本文已收录至我的Github仓库DayDayUP:github.com/RobodLee/DayDayUP,欢迎Star,更多文章请前往:目录导航 前言 我在去年就学习过Java中 ...