【每日一题】20.K-th Number (二分 + 尺取)
关于此题,我们分析一下:
一个区间第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 (二分 + 尺取)的更多相关文章
- hdu 6231 -- K-th Number(二分+尺取)
题目链接 Problem Description Alice are given an array A[1..N] with N numbers. Now Alice want to build an ...
- 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 ...
- CISP/CISA 每日一题 20
CISSP 每日一题(答) What methods can be used to protectmobile devices such as a smartphone? Encryption,GPS ...
- <每日一题> Day4:CodeForces-1042A.Benches(二分 + 排序)
题目链接 参考代码: /* 排序 + 每次取小 #include <iostream> #include <algorithm> using namespace std; co ...
- 【每日一题】【直接循环&二分查找】2022年2月10日-NC32 求平方根
描述实现函数 int sqrt(int x).计算并返回 x 的平方根(向下取整) 方法1:直接循环 import java.util.*; public class Solution { /** * ...
- 51nod-1686 第K大区间(二分+尺取法)
题目链接: 第K大区间 基准时间限制:1 秒 空间限制:131072 KB 定义一个区间的值为其众数出现的次数.现给出n个数,求将所有区间的值排序后,第K大的值为多少. Input 第一行两个数 ...
- UVALive - 2678 二分/尺取
题意:求最小的长度L满足该长度上的元素和大于等于S 最近dp做多了总有一种能用dp解决一切的错觉 二分长度解决 #include<iostream> #include<algorit ...
- 【二分+尺取】HDU 6119 小小粉丝度度熊
http://acm.hdu.edu.cn/showproblem.php?pid=6119 [思路] 首先通过处理交叉的可以处理成不交叉的 然后二分查找答案 如何判断一个长度是否可行? 双指针O(n ...
- 【JavaScript】Leetcode每日一题-矩形区域不超过K的最大值和
[JavaScript]Leetcode每日一题-矩形区域不超过K的最大值和 [题目描述] 给你一个 m x n 的矩阵 matrix 和一个整数 k ,找出并返回矩阵内部矩形区域的不超过 k 的最大 ...
- 【js】Leetcode每日一题-完成所有工作的最短时间
[js]Leetcode每日一题-完成所有工作的最短时间 [题目描述] 给你一个整数数组 jobs ,其中 jobs[i] 是完成第 i 项工作要花费的时间. 请你将这些工作分配给 k 位工人.所有工 ...
随机推荐
- 伯俊ERP与金蝶云星空对接集成连通应收单新增
伯俊ERP与金蝶云星空对接集成表头表体组合查询连通应收单新增(应收单-标准应收单(KD应收单销售退) 数据源系统:伯俊ERP 未来,伯俊科技也会砥砺前行,不断为品牌提供更全面的零售终端致胜利器.伯俊科 ...
- 【GIT】学习day02 | git环境搭建并将项目进行本地管理【外包杯】
进入终端 输入GitHub或者给gitee的用户名和邮箱地址 然后依次敲入一下信息 git commit -m "init project" git init git add . ...
- 【Javaweb】Servlet八 | 请求转发的代码实现【详解】
请求的转发 什么是请求的转发? 请求转发是指,服务器收到请求时,从一次资源转到另一个资源的操作叫做请求转发. 部分代码 // 获取请求的参数(办事的材料)查看 String username=req. ...
- IIS安装与配置
一.环境介绍 Windows Server 2019 64位 标准版 二.IIS安装 2.1.打开服务器管理器,单击添加角色和功能 在Windows Server 2019 服务器管理中,点击角色和功 ...
- python操作mongodb基本使用
使用pymongo,具体可以参考官方文档: 语法上基本和原生mongodb是一样的,所以非常容易入手... https://pymongo.readthedocs.io/en/stable/tutor ...
- Shiro-550反序列化漏洞(CVE-2016-4437)复现
本文章使用Shiro_exploit此工具复现,靶机环境为vulhub 项目地址: https://github.com/insightglacier/Shiro_exploit https://gi ...
- JavaFx之使用高版本JDK(二十八)
JavaFx之使用高版本JDK(二十八) 如何使用高版本的jfx? 根据官网的需要手动引入jfx模块(运行参数:–module-path) 要知道高版本jfx已经集成了丰富的主流功能,例如视频编码,大 ...
- UnionFind 并查集
简介 UnionFind 主要用于解决图论中的动态联通性的问题(对于输入的一系列元素集合,判断其中的元素是否是相连通的). 以下图为例: 集合[1, 2, 3, 4] 和 [5, 6]中的每个元素之间 ...
- 39. 干货系列从零用Rust编写负载均衡及代理,正则及格式替换
wmproxy wmproxy已用Rust实现http/https代理, socks5代理, 反向代理, 静态文件服务器,四层TCP/UDP转发,七层负载均衡,内网穿透,后续将实现websocket代 ...
- Prometheus 监控告警系统搭建(对接飞书告警)
Prometheus 是一套开源的系统监控报警框架,非常适合大规模集群的监控.它也是第二个加入CNCF的项目,受欢迎度仅次于 Kubernetes 的项目.本文讲解完整prometheus 监控和告警 ...