【每日一题】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 位工人.所有工 ...
随机推荐
- Excel中最牛的Index和match函数介绍
当谈到Excel中最强大的函数时,INDEX和MATCH往往会被提及.它们经常一起使用,可以用来查找和返回数据表中的特定数值或信息.下面是对这两个函数的详细介绍: INDEX 函数: INDEX函数的 ...
- Echarts图表基本参数设置说明
ECharts 是一款强大的数据可视化库,可以通过 JavaScript 构建交互式和动态的图表.在使用 ECharts 进行图表绘制时,我们可以通过设置各种参数来达到我们想要的效果.下面是对 ECh ...
- TPC-DS工具介绍及性能测试
一. Hive-testbench工具介绍 TPC-DS:https://www.cnblogs.com/webDepOfQWS/p/10544528.html 由于原生态工具生产测试数据表存在bug ...
- 介绍一个我开源的项目:一键部署 VictoriaMetrics 群集
作者:张富春(ahfuzhang),转载时请注明作者和引用链接,谢谢! cnblogs博客 zhihu Github 公众号:一本正经的瞎扯 我实在是非常喜欢这个强大的 metrics 监控组件 Vi ...
- C++ Qt开发:MdiArea多窗体组件
Qt 是一个跨平台C++图形界面开发库,利用Qt可以快速开发跨平台窗体应用程序,在Qt中我们可以通过拖拽的方式将不同组件放到指定的位置,实现图形化开发极大的方便了开发效率,本章将重点介绍MdiArea ...
- Sql整理
1:数据库 数据库是以某种有组织的方式存储的数据集合. 保存有组织数据的容器,通常是一个文件或者一组文件. SQL 是Structured Query Language (结构化查询语言)的缩写. 2 ...
- BUUCTF Web CyberPunk WriteUp
想直接查看payload的点这里 前言 二次注入(Second-Order Injection)是指攻击者在应用程序中注入恶意数据,然后在稍后的操作或不同的上下文中再次使用该恶意数据,导致安全漏洞.它 ...
- java获取包下所有java类
java获取包下所有java类 简单加载包下的类,注意简单编写非递归查找,自行实现递归查找即可 import java.io.File; import java.net.URL; import jav ...
- dfs之迭代加深
为什么要用迭代加深 \(dfs\) 每次会选择搜索树的一个分支,不断深入,直到达到递归边界条件:但这种搜索策略带有一定的缺陷性: 如果搜索树的某一个分支中的节点个数特别多,但是答案并不在这棵子树里面, ...
- fstab 简介
简介 在一般的 Unix 或者 类Unix 中,为了更好地管理磁盘资源,有时不得不挂载一个外部的磁盘,使用 mount 命令可以快速地挂载一个外部磁盘,具体用法为: # 将磁盘分区 sda2 挂载在 ...