K-th Number
K-th Number
https://ac.nowcoder.com/acm/problem/14301
题意:把每段区间第k大的数放到集合中,求集合中的第m大数。
思路:二分+尺取,二分答案,然后算出第k大数大于等于x的区间数量,我们发现mid越大满足条件的数量越来越少,这就符合二分的单调性,同时尺取的话,也是满足的,i和j两个指针只会往右走,复杂度O(nlog(n)) 挺无语的,这个check函数写不明白,乱调调出来的。
#include<bits/stdc++.h>
using namespace std;
const int N=100010;
#define int long long
int n,k,m;
int a[N];
bool check(int x)//第k大值大于x的区间数量
{
int j=0;
int res=0;
int cnt=0;
for(int i=1;i<=n;i++)
{
while(j<=n && cnt<k)
{
j++;
if(a[j]>=x)
cnt++;
}
if(cnt==k)
{
// cout<<i<<" "<<j<<" "<<endl;
res+=n-j+1;
}
if(a[i]>=x)
cnt--;
}
// cout<<res<<" "<<m-1<<endl;
return res>=m;
}
signed main()
{
ios::sync_with_stdio(0);
cin.tie(0),cout.tie(0);
int t;
cin>>t;
while(t--)
{
cin>>n>>k>>m;
for(int i=1;i<=n;i++)
cin>>a[i];
int l=1,r=1e9;
//cout<< check(1)<<endl;
while(l<r)
{
int mid=l+r+1>>1;
if(check(mid)) l=mid;
else r=mid-1;
}
cout<<r<<endl;
}
return 0;
}
美团成长空间 2667人发布
查看3道真题和解析