hdu 1105 二分答案
阿新 • • 發佈:2018-12-23
二分答案,每次確定mid是第幾大的數,然後調整。
#include <iostream>
#include <algorithm>
#include <vector>
using namespace std;
const int maxn=50000;
long long n,k;
long long A[maxn],B[maxn];
long long Ca(long long x){
long long f;
long long ret1=0;
for(int i=0;i<n;i++){
f=x/A[i];
if (x%A[i]!=0)
f++;
if(B[n-1]>=f)
ret1+=(n-(long long)(lower_bound(B,B+n,f)-B));
}
return ret1;
}
int main()
{
cin>>n>>k;
for(int i=0;i<n;i++){
cin>>A[i]>>B[i];
}
sort(A,A+n);
sort(B,B+n);
long long l=A[0 ]*B[0],r=A[n-1]*B[n-1],mid;
while(l<=r){
mid=(l+r)/2;
long long x=Ca(mid);
if(x>=k){
l=mid+1;
}
else{
r=mid-1;
}
}
cout<<l-1<<endl;
return 0;
}