一直没想到二分然后想正解 看了别人说才想到
那么这题就简单了 二分答案然后验证
check函数为 判断第K大的数大于等于x的区间数
面向结果编程.....
#include<bits/stdc++.h>
#define ll long long
using namespace std;
ll const N=1e5+10;
ll n,m,k,a[N],t;
bool check(ll x)
{
ll num=0,s=0;
for(int i=1,j=1;j<=n;j++)
{
if(a[j]>=x) num++;///值大于X
if(num==k)///出现k个值大于等于X
{
s+=n-j+1;///将右边界大于等于j的区间都算上
while(a[i]<x) s+=n-j+1,i++;///左边界右移 如果num没少 又加一次右边界等于大于j的区间
num--;i++;///这个左边界值大于X
}
}
return s>=m;
}
int main()
{
scanf("%lld",&t);
while(t--)
{
scanf("%lld%lld%lld",&n,&k,&m);
for(int i=1;i<=n;i++)scanf("%lld",&a[i]);
ll l=1,r=1e9,ans=0,mid;
while(l<=r)
{
mid=(l+r)>>1;
if(check(mid))ans=mid,l=mid+1;
else r=mid-1;
}
printf("%lld\n",ans);
}
return 0;
}

京公网安备 11010502036488号