Wannafly Camp 2020 Day 1F 乘法

一开始想根据单调性双指针

后来血了才想起来负负得正

于是暴力二分答案即可

#include <bits/stdc++.h>
using namespace std;
#define int long long
const int N = 1000005;
int n,m,k,a[N],b[N];
int calc(int x) {
    int r=0;
    for(int i=1;i<=n;i++) {
        if(a[i]>0) r+=lower_bound(b+1,b+m+1,(double)x/a[i])-(b+1);
        if(a[i]<0) r+=m-(upper_bound(b+1,b+m+1,(double)x/a[i])-b)+1;
        if(a[i]==0) if(x<0) r+=m;
    }
    return r;
}
int check() {
    vector <int> v;
    for(int i=1;i<=n;i++) {
        for(int j=1;j<=m;j++) {
            v.push_back(a[i]*b[j]);
        }
    }
    sort(v.begin(),v.end());
    return v[k-1];
}
signed main() {
    scanf("%lld%lld%lld",&n,&m,&k);
    k=n*m-k+1;
    for(int i=1;i<=n;i++) scanf("%lld",&a[i]);
    for(int i=1;i<=m;i++) scanf("%lld",&b[i]);
    sort(a+1,a+n+1);
    sort(b+1,b+m+1);
    int l=-(1ll<<60),r=1ll<<60;
    while(r>l) {
        int mid=(l+r)>>1;
        if(calc(mid)>=k) r=mid;
        else l=mid+1ll;
    }
    printf("%lld",l-1);
    //printf(" %lld",check());
}
原文地址:https://www.cnblogs.com/mollnn/p/12254273.html