K-th number 二分,尺取
K-th Number
http://www.nowcoder.com/questionTerminal/58debfa9e0004cf4842d05c8145918f6
题意:给Alice一个数组A[1..N]和N个数字。
现在Alice想用参数K构建一个数组B,规则如下:
最初,数组B是空的。考虑数组A中的每个间隔。如果此间隔的长度小于K,则忽略此间隔。否则,在此间隔中找到第K个最大的数字,并将该数字添加到数组B中。
事实上,Alice并不关心数组B中的每个元素。她只想知道数组B中的第M个最大元素。请帮助她查找这个数字。
知识点:二分,尺取。
代码:
#include <bits/stdc++.h> using namespace std; #define ll long long ll num[100005]; ll n,k,p; bool pd(ll m) { ll ct=0; ll ans=0; for(int r=0,l=0;r<n;r++) { if(num[r]>=m) ct++; while(l<=r && ct==k) { ans+=n-r; if(num[l++]>=m) ct--; } } return ans>=p; } int main() { int T; scanf("%d",&T); while(T--) { scanf("%lld%lld%lld",&n,&k,&p); for(int i=0;i<n;i++) { scanf("%lld",&num[i]); } ll l=1,r=1e9; while(l<=r) { ll m=(l+r)>>1; if(pd(m)) l=m+1; else r=m-1; } printf("%lld\n",r); } return 0; }