#include <bits/stdc++.h>
using namespace std;
#define LL long long
#define N 100010
int a[N],k,n;
LL m;
LL get_sum(int x){
LL tot=0;
int l=1,r=1,sum=0;
while (l <= n) {
while (sum<k && r<=n){
if (a[r] >= x) sum++;
r++;
}
if (sum >= k) tot+=1LL*(n-r+2);
if (a[l] >= x) sum--;
l++;
}
return tot;
}
int main(){
int T,i;
scanf("%d",&T);
while (T--){
int b[N];
scanf("%d%d%lld",&n,&k,&m);
for (i=1; i<=n; i++){
scanf("%d",&a[i]);
b[i]=a[i];
}
sort(b+1,b+1+n);
int l=1,r=unique(b+1,b+1+n)-b-1,mid,ans;
while (l <= r){
mid=(l+r)>>1;
if (get_sum(b[mid]) < m) r=mid-1;
else {
ans=b[mid];
l=mid+1;
}
}
printf("%d\n",ans);
}
return 0;
}
题意:给你n个数,将所有大小不小于k的区间中的第k大值取出来,形成一个新的序列,找出新序列中第m大的值
解题思路:二分+尺取法,二分答案,然后用尺取法就可以处理出有多少个区间的和不小于k,若这样的区间个数大于等于m,则答案应该继续变大,否则应该变小