把两个序列排序,知道最大的数和最小的数,在范围内二分答案;
如果小于mid的数大于等于k个,说明mid太大;
反之,mid太小;
#include <iostream>
#include <cstdio>
#include <algorithm>
#define LL long long
using namespace std;
const int N=2e5+10;
int n,m;
LL a[N],b[N],ans,k;
LL read(){LL s=0,f=1;char c=getchar();while(c>'9'||c<'0'){if(c=='-')f=-1;c=getchar();}while(c>='0'&&c<='9'){s=s*10+c-'0';c=getchar();}return s*f;}
bool sx(LL x)
{
int p=m;LL sum=0;
for(int i=1;i<=n;i++){
LL u=a[i];
while(u*b[p]>=x&&p) --p;
sum+=p;
if(sum>k-1) return 1;
}
return 0;
}
int main()
{
freopen("number.in","r",stdin);
freopen("number.out","w",stdout);
scanf("%d%d%lld",&n,&m,&k);
for(int i=1;i<=n;++i) a[i]=read();
for(int i=1;i<=m;++i) b[i]=read();
sort(a+1,a+n+1);sort(b+1,b+m+1);
LL l=a[1]*b[1],r=a[n]*b[m],mid;
while(l<=r){
mid=l+r>>1;
if(sx(mid)) r=mid-1;
else ans=mid,l=mid+1;
}
printf("%lld",ans);
return 0;
}