题意:
从数组A的所有子连续序列取第k大构成数组B,求B数组第m大
思路:
B数组第m大具有单调性,枚举第m大x,双指针遍历A数组,找符合第k大数大于等于x的子序列个数res,将res与m做比较,
#include<bits/stdc++.h>
using namespace std;
using ll=long long;
const int maxn=2e5+5;
int T,n,k,a[maxn];
ll m;
ll check(int x){
ll he=0,cnt=0;
for(int l=1,r=1;r<=n;r++){
if(a[r]>=x)cnt++;
while(l<=r&&cnt>=k){
he+=n-r+1;
if(a[l]>=x)cnt--;
l++;
}
}
return he;
}
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]);
}
int l=0,r=1e9+4,ans=0;
while(l<=r){
int mid=(l+r)>>1;
if(check(mid)<m)r=mid-1;
else l=mid+1,ans=mid;
}
printf("%d\n",ans);
}
}