关于此题,我们分析一下:

一个区间第k大的数不小于x的条件是什么?

答案就是一个区间内不小于x的数的个数不小于k

那么,我们就会发现,我们其实并不需要知道每个数的值,实际上对我们有用的只有每个数与x的大小关系,然后,我们就可以直接用贡献法计算。

我们把所有值不下于x的赋为1,剩下的赋为0,那么,二分求的东西就被转换成了:

有多少个区间的区间和不下于k,且序列里面的值只可能是0或1

然后随便搞个前缀和加个单调指针就行了

(其实可以不用单调指针直接用桶存的,常数更小,但是,由于脑袋有点晕,出锅了,就懒得改了)

代码:

#include <bits/stdc++.h>
using namespace std;
#define int long long
const int N = 1e5 + 1;
int a[N], b[N];
int n, k, m;
inline int calc(int x) {
for (int i = 1; i <= n; ++i) {
b[i] = (a[i] >= x);
b[i] += b[i - 1];
}
int ans = 0, l = 1;
for (int i = 1; i <= n; ++i) { //枚举右端点
while (b[i] - b[l - 1] >= k) ++l;
ans += (l - 1);
}
return ans;
}
inline int read() {
char ch = getchar();
int w = 0, ss = 0;
while (ch < '0' || ch > '9') w |= (ch == '-'), ch = getchar();
while (ch >= '0' && ch <= '9') ss = (ss * 10 + (ch - '0')), ch = getchar();
return w ? -ss : ss;
}
signed main() {
int T = read();
while (T--) {
n = read(), k = read(), m = read();
for (int i = 1; i <= n; ++i) a[i] = read(); int l = 1, r = 1e9, ans = 0;
while (l <= r) {
int mid = (l + r) >> 1;
int tot = calc(mid); //区间kth大于等于mid的有几个
if (tot >= m) {
ans = mid;
l = mid + 1;
} else
r = mid - 1;
}
printf("%lld\n", ans);
}
return 0;
}

另外一种写法

#include <cstdio>
#include <iostream>
using namespace std;
const int N = 1e5;
int a[N + 2], s[N + 2];
int main() {
int T, n, i, j, K, l, r, mid;
long long m, res;
scanf("%d", &T);
while (T--) {
scanf("%d%d%lld", &n, &K, &m);
for (i = r = 1, l = 1e9; i <= n; i++) {
scanf("%d", &a[i]);
l = min(l, a[i]);
r = max(r, a[i]);
}
while (l < r) {
mid = l + r >> 1;
for (i = 1, res = j = 0; i <= n; i++) {
s[i] = s[i - 1] + (a[i] > mid);
while (j < i && s[j] <= s[i] - K) j++;
res += j;
}
res >= m ? l = mid + 1 : r = mid;
}
printf("%d\n", l);
}
return 0;
}

【每日一题】20.K-th Number (二分 + 尺取)的更多相关文章

  1. hdu 6231 -- K-th Number(二分+尺取)

    题目链接 Problem Description Alice are given an array A[1..N] with N numbers. Now Alice want to build an ...

  2. Educational Codeforces Round 53 (Rated for Div. 2) C. Vasya and Robot 【二分 + 尺取】

    任意门:http://codeforces.com/contest/1073/problem/C C. Vasya and Robot time limit per test 1 second mem ...

  3. CISP/CISA 每日一题 20

    CISSP 每日一题(答) What methods can be used to protectmobile devices such as a smartphone? Encryption,GPS ...

  4. <每日一题> Day4:CodeForces-1042A.Benches(二分 + 排序)

    题目链接 参考代码: /* 排序 + 每次取小 #include <iostream> #include <algorithm> using namespace std; co ...

  5. 【每日一题】【直接循环&二分查找】2022年2月10日-NC32 求平方根

    描述实现函数 int sqrt(int x).计算并返回 x 的平方根(向下取整) 方法1:直接循环 import java.util.*; public class Solution { /** * ...

  6. 51nod-1686 第K大区间(二分+尺取法)

    题目链接: 第K大区间 基准时间限制:1 秒 空间限制:131072 KB    定义一个区间的值为其众数出现的次数.现给出n个数,求将所有区间的值排序后,第K大的值为多少. Input 第一行两个数 ...

  7. UVALive - 2678 二分/尺取

    题意:求最小的长度L满足该长度上的元素和大于等于S 最近dp做多了总有一种能用dp解决一切的错觉 二分长度解决 #include<iostream> #include<algorit ...

  8. 【二分+尺取】HDU 6119 小小粉丝度度熊

    http://acm.hdu.edu.cn/showproblem.php?pid=6119 [思路] 首先通过处理交叉的可以处理成不交叉的 然后二分查找答案 如何判断一个长度是否可行? 双指针O(n ...

  9. 【JavaScript】Leetcode每日一题-矩形区域不超过K的最大值和

    [JavaScript]Leetcode每日一题-矩形区域不超过K的最大值和 [题目描述] 给你一个 m x n 的矩阵 matrix 和一个整数 k ,找出并返回矩阵内部矩形区域的不超过 k 的最大 ...

  10. 【js】Leetcode每日一题-完成所有工作的最短时间

    [js]Leetcode每日一题-完成所有工作的最短时间 [题目描述] 给你一个整数数组 jobs ,其中 jobs[i] 是完成第 i 项工作要花费的时间. 请你将这些工作分配给 k 位工人.所有工 ...

随机推荐

  1. 伯俊ERP与金蝶云星空对接集成连通应收单新增

    伯俊ERP与金蝶云星空对接集成表头表体组合查询连通应收单新增(应收单-标准应收单(KD应收单销售退) 数据源系统:伯俊ERP 未来,伯俊科技也会砥砺前行,不断为品牌提供更全面的零售终端致胜利器.伯俊科 ...

  2. 【GIT】学习day02 | git环境搭建并将项目进行本地管理【外包杯】

    进入终端 输入GitHub或者给gitee的用户名和邮箱地址 然后依次敲入一下信息 git commit -m "init project" git init git add . ...

  3. 【Javaweb】Servlet八 | 请求转发的代码实现【详解】

    请求的转发 什么是请求的转发? 请求转发是指,服务器收到请求时,从一次资源转到另一个资源的操作叫做请求转发. 部分代码 // 获取请求的参数(办事的材料)查看 String username=req. ...

  4. IIS安装与配置

    一.环境介绍 Windows Server 2019 64位 标准版 二.IIS安装 2.1.打开服务器管理器,单击添加角色和功能 在Windows Server 2019 服务器管理中,点击角色和功 ...

  5. python操作mongodb基本使用

    使用pymongo,具体可以参考官方文档: 语法上基本和原生mongodb是一样的,所以非常容易入手... https://pymongo.readthedocs.io/en/stable/tutor ...

  6. Shiro-550反序列化漏洞(CVE-2016-4437)复现

    本文章使用Shiro_exploit此工具复现,靶机环境为vulhub 项目地址: https://github.com/insightglacier/Shiro_exploit https://gi ...

  7. JavaFx之使用高版本JDK(二十八)

    JavaFx之使用高版本JDK(二十八) 如何使用高版本的jfx? 根据官网的需要手动引入jfx模块(运行参数:–module-path) 要知道高版本jfx已经集成了丰富的主流功能,例如视频编码,大 ...

  8. UnionFind 并查集

    简介 UnionFind 主要用于解决图论中的动态联通性的问题(对于输入的一系列元素集合,判断其中的元素是否是相连通的). 以下图为例: 集合[1, 2, 3, 4] 和 [5, 6]中的每个元素之间 ...

  9. 39. 干货系列从零用Rust编写负载均衡及代理,正则及格式替换

    wmproxy wmproxy已用Rust实现http/https代理, socks5代理, 反向代理, 静态文件服务器,四层TCP/UDP转发,七层负载均衡,内网穿透,后续将实现websocket代 ...

  10. Prometheus 监控告警系统搭建(对接飞书告警)

    Prometheus 是一套开源的系统监控报警框架,非常适合大规模集群的监控.它也是第二个加入CNCF的项目,受欢迎度仅次于 Kubernetes 的项目.本文讲解完整prometheus 监控和告警 ...