题目链接:http://acm.hdu.edu.cn/contests/contest_showproblem.php?pid=1002&cid=784
题意:
给你n个数,之后求出所有连续区间的第k大并把他们排成一排,之后再求出这一排中第m大的数
思路:
这题思路挺难得
二分答案x,对于当前x,可以用类似于尺取的方法可以得出有多少个区间满足第k大的数>=x,然后通过这个区间数量与m的大小关系来决定二分的方向
//2017CCPC哈尔滨--B
#include<stdio.h>
#include<string.h>
#define LL long long
int n, k, a[100005];
LL Jud(int x)
{
LL ans;
int i, p, sum;
ans = sum = p = 0;
for(i=1;i<=n;i++)
{
while(sum<k && p<=n)
{
if(a[++p]>=x)
sum++;
}
ans += n-p+1;
if(a[i]>=x)
sum--;
}
return ans;
}
int main(void)
{
LL m;
int T, i, l, r, mid;
scanf("%d", &T);
while(T--)
{
scanf("%d%d%lld", &n, &k, &m);
for(i=1;i<=n;i++)
scanf("%d", &a[i]);
l = 1, r = 1000000000;
while(l<r)
{
mid = (l+r+1)/2;
if(Jud(mid)>=m)
l = mid;
else
r = mid-1;
}
printf("%d\n", r);
}
return 0;
}