hdu6231
2024-08-21 06:18:20
hdu6231
题意
给出一些数字,对于任意长度不小于 \(k\) 的区间,把第 \(k\) 大数加入到一个新的数组 \(B\) 中,求 \(B\) 数组第 \(m\) 大数。
分析
二分答案 \(x\) ,枚举左端点 \(l\) ,找到最小的 \(r\) 使得区间 \([l,r]\) 中有至少 \(k\) 个数大于等于 \(x\),那么右端点的取值个数为 \(n-r+1\),尺取法维护下,将右端点的个数累加求和。如果和大于等于 \(m\) 说明答案一定大于等于 \(x\) 否则一定小于 \(x\) 。
code
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int MAXN = 1e5 + 10;
int a[MAXN], n, k;
ll m;
ll check(int x) {
int r = 0, s = 0;
ll res = 0;
for(int i = 0; i < n; i++) {
while(r < n && s < k) {
if(a[r] >= x) s++;
r++;
}
if(s == k) res += n - r + 1;
if(a[i] >= x) s--;
}
return res;
}
int main() {
int T;
scanf("%d", &T);
while(T--) {
scanf("%d%d%lld", &n, &k, &m);
for(int i = 0; i < n; i++) {
scanf("%d", &a[i]);
}
int l = 0, r = 1e9, ans = 0;
while(l <= r) {
int mid = l + r >> 1;
if(check(mid) >= m) {
ans = mid;
l = mid + 1;
} else r = mid - 1;
}
printf("%d\n", ans);
}
return 0;
}
最新文章
- Bootstrap CSS概览代码文字标注篇
- Azure ARM (11) ARM模式下,创建虚拟机并配置负载均衡器
- R语言XML格式数据导入与处理
- guava 学习笔记 使用瓜娃(guava)的选择和预判断使代码变得简洁
- struts.xml框架
- iOS 容器 addChildViewController
- Java 基本数据类型 sizeof 功能【转】
- xcode XCTest录制后测试出错临时解决方法
- Flex xxx-app.xml配置
- Linux桌面扩展 Docky
- EF 的 霸气配置
- zabbix监控redis多实例(low level discovery)
- 使用百度语音识别REST API,做全平台语音识别
- JS图片上传后base64转码
- 【linux】 Makefile之make menuconfig /uImage
- HDOJ 4607 - Park Visit
- 温故而知新--JavaScript书摘(三)
- ubuntu 登陆信息打印 -- motd
- 网络层block,delegate之优劣分析
- MVC 翻頁的那些坑
热门文章
- poj3347 Kadj Squares (计算几何)
- Codeforces Round #430 (Div. 2) Vitya and Strange Lesson
- 洛谷 P1415 拆分数列 解题报告
- taotao用户注册前台页面
- UVA10480:Sabotage(最小割+输出)
- WEB API 版本控制
- 【Foreign】划分序列 [线段树][DP]
- [BZOJ1151][CTSC2007]动物园zoo 解题报告|DP|位运算
- Ansible在节点间传输文件
- mongodb的数据库操作