题意
给你一个A数组 让你其中每个len>=k的区间中的第k大数丢到另一个B数组 问你B数组中的第M大
思路
二分答案 check(x)求出区间第k大>=x的个数(尺取)
check(x)==M刚好是答案
>M:X还可以更大
#include<cstdio>
#include<iostream>
#include<algorithm>
#include<cmath>
using namespace std;
typedef long long LL;
const int MaxN = 1e5 + 5;
int t,n,k,a[MaxN],b[MaxN];
LL M;
LL check(int x){
int cnt = 0,p = 0;//至少cnt个>=x p指针
LL cur = 0;
for(int i = 1;i <= n; i++){
while(p <= n && cnt < k){
if(a[++p] >= x) cnt++;
}
cur += n - p + 1;
if(a[i] >= x) cnt--;
}
return cur;
}
int main()
{
scanf("%d",&t);
while(t--){
scanf("%d %d %lld",&n,&k,&M);
for(int i = 1;i <= n; i++){
scanf("%d",&a[i]);
b[i] = a[i];
}
sort(b + 1,b + 1 + n);
int l = 1,r = n,mid,ans = 0;
while(l <= r){
mid = (l + r) / 2;
LL cur = check(b[mid]);
if(cur == M){
ans = mid;
break;
}
else if(cur > M){//X还可以更大
ans = mid;
l = mid + 1;
}
else r = mid - 1;
}
// cout << ans <<"###\n";
printf("%d\n",b[ans]);
}
}