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;
}
全部评论

相关推荐

12-27 22:49
门头沟学院 Java
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务