题意
给定一个长度为 的数组 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; }