题目链接
题解:
对结果进行二分,就是找满足条件的数而不是它的位置。左右边界是数的最大乘积和最小乘积。
代码:
#include<iostream>
#include<stdio.h>
#include<algorithm>
using namespace std;
const int MAX_N=5e4+10;
typedef long long LL;
LL a[MAX_N],b[MAX_N];
LL judge(LL mid,LL n)
{
LL m=0,sum=0;
for(int i=n-1;i>=0;i--){
if(mid%a[i]) //遍历数组A二分数组B,找出大于等于mid的数的个数
m=mid/a[i]+1;
else
m=mid/a[i];
int d=lower_bound(b,b+n,m)-b;
sum+=(n-d);
if(sum==0)
break;
}
return sum;
}
int main()
{
LL n,k;
scanf("%lld%lld",&n,&k);
for(int i=0;i<n;i++)
scanf("%lld%lld",&a[i],&b[i]);
sort(a,a+n); sort(b,b+n);
LL l=a[0]*b[0],r=a[n-1]*b[n-1];
while(l<=r){ //对结果二分
LL mid=(l+r)>>1;
if(judge(mid,n)<k) r=mid-1;
else l=mid+1;
}
printf("%lld\n",r);
return 0;
}