十分简单的一道二分答案了:
#include <cmath>
#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
#define ll long long
#define rep(i,x,y) for(ll i=(x);i<=(y);i++)
#define red(i,x,y) for(ll i=(x);i>=(y);i--)
using namespace std;
const ll N=1e5+5;
const ll Inf=1e18;
ll n,m,k,a[N],b[N];
bool check(ll x) {
ll tot=0;
rep(i,1,n) {
ll l=1,r=m,ret=0;
while(l<=r) {
ll mid=l+r>>1;
if(a[i]*b[mid]>=x) ret=mid,l=mid+1;
else r=mid-1;
}
tot+=ret;
}
return tot>=k;
}
bool cmp(ll p,ll q) {
return p>q;
}
int main() {
while(~scanf("%lld%lld%lld",&n,&m,&k)) {
rep(i,1,n) scanf("%lld",&a[i]);
rep(i,1,m) scanf("%lld",&b[i]);
sort(a+1,a+1+n,cmp);
sort(b+1,b+1+m,cmp);
ll l=a[n]*b[m],r=a[1]*b[1],ans=l;
while(l<=r) {
ll mid=l+r>>1;
if(check(mid)) ans=mid,l=mid+1;
else r=mid-1;
}
printf("%lld\n",ans);
}
return 0;
}