(二分+尺取法)
题意:给定长度为
思路:这题入手点很关键,由于答案肯定是
注意:
代码:
#include <cstdio>
#include <cstring>
#include <algorithm>
#define LL long long
using namespace std;
const int maxn = 100010;
int a[maxn], b[maxn];
LL get_rk(int x, int n, int k) {
int r = -1;
LL ret = 0, rk = 0;
for(int l=0; l<n; l++) {
while(rk < k && r < n) {
rk += a[++r]>=x? 1:0;
}
if(rk >= k)
ret += (LL)(n-r);
rk -= a[l]>=x? 1:0;
}
//printf("x:%d ret:%I64d\n",x,ret);
return ret;
}
void solve() {
int n, k; LL m;
scanf("%d%d%I64d",&n,&k,&m);
for(int i=0; i<n; i++) {
scanf("%d",&a[i]);
b[i] = a[i];
}
sort(b, b+n);
int l = 0, r = unique(b, b+n) - b - 1;
while(l < r) {
int mid = (l+r+1) / 2;
if(get_rk(b[mid], n, k) >= m) l = mid;
else r = mid - 1;
//printf("l:%d r:%d\n",l,r);
}
printf("%d\n",b[l]);
}
int main() {
int T;
scanf("%d",&T);
while(T --) {
solve();
}
return 0;
}