ZOJ 3278 8G Island【二分答案】
阿新 • • 發佈:2018-11-08
十分簡單的一道二分答案了:
#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; }