D - Pairs
题意:
给你n个数,一共有n(n-1)个乘积,求第k大的数是多少。
n最大有2e5
思路:
二分里面套二分
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int INF = 0x3f3f3f3f;
const ll mod = 1e9 +7;
const ll MAXN = 1e6 + 5;
ll n,k;
ll a[MAXN];
//判断在当前的数之前有多少个数
ll check(ll x){
ll res=0;
for(int i=0;i<n;i++){
if(a[i]<0){
ll L=i,R=n;
while(R-L>1){
ll mid=L+R>>1;
if(a[i]*a[mid]<=x){//这里要注意和下面不一样的是 当a[i]<0的时候mid取小 乘积反而会增大
R=mid;
}else{
L=mid;
}
}
res+=n-R;
}else{
ll L=i,R=n;
while(R-L>1){
ll mid=L+R>>1;
if(a[i]*a[mid]<=x){//a[i]>0 mid取大 乘积增大
L=mid;
}else{
R=mid;
}
}
res+=L-i;
}
}
return res;
}
int main(){
ios::sync_with_stdio(false);
cin.tie(0);
cin>>n>>k;
for(int i=0;i<n;i++) cin>>a[i];
sort(a,a+n);
ll L=-1e18,R=1e18;
while(R-L>1){
ll Mid=L+R>>1;
if(check(Mid)<k){
L=Mid;
}else{
R=Mid;
}
}
cout<<R;
return 0;
}