样例全过,
AC*59
WA*20
用两个数组 pos neg分别存正数和负数,然后二分
#include<bits/stdc++.h>
using namespace std;
#define int long long
int n,k,a[200010],ans=0;
int pos[200010],id1=0,neg[200010],id2=0,zero=0;
int check(int x){
//cout<<x<<endl;
int num=0;
for(int i=1;i<=n;i++){
if(x<0){
if(a[i]==0) continue;
if(a[i]>0) num+=upper_bound(neg+1,neg+id2+1,-((-x)/a[i]+1))-neg-1;
else num+=id1-(lower_bound(pos+1,pos+id1+1,(-x)/(-a[i])+1)-pos);
}else if(x==0){
if(a[i]==0) continue;
if(a[i]>0) num+=id2-1;
else num+=id1-1;
}else{
if(a[i]==0) num+=n-1;
else if(a[i]>0) num+=zero+id2-1+(upper_bound(pos+1,pos+id1+1,x/a[i]-(x%a[i]==0))-pos-1);
else num+=zero+id1-1+id2-(lower_bound(neg+1,neg+id2+1,-(x/(-a[i])+1))-neg);
if(a[i]*a[i]<x&&a[i]!=0) num--;
}
}
num/=2;
//cout<<x<<","<<num<<endl;
return n*(n-1)/2-num;
}
signed main(){
cin>>n>>k;
k=(n*(n-1)/2)-k+1;
for(int i=1;i<=n;i++) cin>>a[i];
sort(a+1,a+n+1);
for(int i=1;i<=n;i++){
if(a[i]==0) zero++;
if(a[i]>0) pos[++id1]=a[i];
if(a[i]<0) neg[++id2]=a[i];
}
pos[++id1]=1e18,neg[++id2]=1e18;
int l=-1e18,r=1e18;
while(l<=r){
int mid=(l+r)>>1;
if(check(mid)>=k) ans=mid,l=mid+1;
else r=mid-1;
}
cout<<ans<<endl;
return 0;
}