题意
给定一个长度为 的数组 A ,把所有长度 >=
的区间中的第
大值插入 B 数组中,求 B 数组的第
大数。
Solution
这种显然二分答案题我们主要关心 问题。
如何计算第 大数
的区间个数?
假设区间 中刚好有
个数
,则
区间全部满足第
大数
。
因此考虑尺取,若当前区间满足 个数
,则计数
,同时移动左边界;否则移动右边界直至。。。当
时,说明
过小,调整左边界,否则调整右边界。
Code
#include <bits/stdc++.h>
using namespace std;
int t, n, k, a[100005];
long long m;
bool check(int x) {
int l = 1, r = 0, cnt = 0;
long long sum = 0;
while (r <= n) {
if (cnt == k) {
sum += (n - r + 1LL);
cnt -= (a[l++] >= x);
} else
cnt += (a[++r] >= x);
}
return sum >= m;
}
int main() {
cin >> t;
while (t--) {
cin >> n >> k >> m;
for (int i = 1; i <= n; i++) cin >> a[i];
int l = 0, r = 1e9 + 7, mid;
while (l + 1 < r) {
int mid = (l + r) >> 1;
if (check(mid))
l = mid;
else
r = mid;
}
cout << l << '\n';
}
return 0;
}
京公网安备 11010502036488号