标签:code frame name amp follow ram fir include algo
InputThe first line is the number of test cases.
For each test case, the first line contains three positive numbers N(1≤N≤105),K(1≤K≤N),MN(1≤N≤105),K(1≤K≤N),M. The second line contains NN numbers Ai(1≤Ai≤109)Ai(1≤Ai≤109).
It‘s guaranteed that M is not greater than the length of the array B.
OutputFor each test case, output a single line containing the MM-th largest element in the array BB.Sample Input
2 5 3 2 2 3 1 5 4 3 3 1 5 8 2
Sample Output
3 2
题意:把所有区间从小到大的第K大取出来再排序,求第M大。
思路:把所有数拿进去二分,大于等于M的数则check成功,R=Mid+1;
#include<cstdio> #include<cstring> #include<algorithm> using namespace std; long long n,k,m,a[100010],b[100010],T,ans; inline bool pd(long long x){ int cnt=0;long long tot=0; for(register int i=1,j=1;i<=n;i++){ while(cnt<k&&j<=n)cnt+=a[j++]>=x; if(cnt<k)break; tot+=n-j+2; cnt-=a[i]>=x; } return tot>=m; } int main(){ for(scanf("%lld",&T);T--;){ scanf("%lld%lld%lld",&n,&k,&m);ans=0; for(register int i=1;i<=n;i++)scanf("%lld",a+i),b[i]=a[i]; sort(b+1,b+1+n); long long l=1,r=n,mid; while(l<=r){ mid=(l+r)>>1; if(pd(b[mid]))ans=mid,l=mid+1; else r=mid-1; } printf("%lld\n",b[ans]); } return 0; }
HDU - 6231:K-th Number (不错的二分)
标签:code frame name amp follow ram fir include algo
原文地址:https://www.cnblogs.com/hua-dong/p/9696915.html