两个数组中的每个数两两相乘,求第K大的数。( n ≤ 50000 n\leq50000 n≤50000)
解:二分答案,枚举 a a a数组中每个数 a i a_i ai,二分出 a i a_i ai与 b j b_j bj乘积中比mid大的数量,然后与k进行比较。
#include<cstdio>
#include<algorithm>
#include<iostream>
#define ll long long
using namespace std;
const int N = 5e4;
int n,k;
ll a[N],b[N];
inline bool check(ll t){
int sum=0;
for(int i=0;i<n;i++) {
ll tar=t%a[i]?t/a[i]+1:t/a[i];
sum += n - (lower_bound(b, b + n, tar) - b);
}
return sum>=k;
}
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);
ll l=1,r=1e18,mid;
while(l<r){
mid=(l+r+1)>>1;
if(check(mid))l=mid;
else r=mid-1;
}
cout << r;
return 0;
}