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;
}

最新文章

  1. Bootstrap CSS概览代码文字标注篇
  2. Azure ARM (11) ARM模式下,创建虚拟机并配置负载均衡器
  3. R语言XML格式数据导入与处理
  4. guava 学习笔记 使用瓜娃(guava)的选择和预判断使代码变得简洁
  5. struts.xml框架
  6. iOS 容器 addChildViewController
  7. Java 基本数据类型 sizeof 功能【转】
  8. xcode XCTest录制后测试出错临时解决方法
  9. Flex xxx-app.xml配置
  10. Linux桌面扩展 Docky
  11. EF 的 霸气配置
  12. zabbix监控redis多实例(low level discovery)
  13. 使用百度语音识别REST API,做全平台语音识别
  14. JS图片上传后base64转码
  15. 【linux】 Makefile之make menuconfig /uImage
  16. HDOJ 4607 - Park Visit
  17. 温故而知新--JavaScript书摘(三)
  18. ubuntu 登陆信息打印 -- motd
  19. 网络层block,delegate之优劣分析
  20. MVC 翻頁的那些坑

热门文章

  1. poj3347 Kadj Squares (计算几何)
  2. Codeforces Round #430 (Div. 2) Vitya and Strange Lesson
  3. 洛谷 P1415 拆分数列 解题报告
  4. taotao用户注册前台页面
  5. UVA10480:Sabotage(最小割+输出)
  6. WEB API 版本控制
  7. 【Foreign】划分序列 [线段树][DP]
  8. [BZOJ1151][CTSC2007]动物园zoo 解题报告|DP|位运算
  9. Ansible在节点间传输文件
  10. mongodb的数据库操作