将公式转换:
∣
a
i
−
x
∣
≤
k
×
b
i
| a_i - x | \le k \times b_i
∣ai−x∣≤k×bi
− k × b i + a i ≤ x ≤ k × b i + a i -k \times b_i + a_i \le x \le k \times b_i + a_i −k×bi+ai≤x≤k×bi+ai
二分答案 k k k。处理出所有的 ( l , r ) (l, r) (l,r),判断有无交集即可。
代码如下:
#include "bits/stdc++.h"
using namespace std;
using LL = long long;
int main()
{
int _; cin>>_;
while(_--) {
LL n; cin>>n;
vector<int> a(n), b(n);
for(auto &t: a) cin>>t;
for(auto &t: b) cin>>t;
vector<pair<LL,LL>> seg(n);
LL l = 0, r = 1e9 + 21;
auto check = [&](LL mid) -> bool {
for(int i = 0; i < n; ++i) {
seg[i] = {a[i] - mid * b[i], mid * b[i] + a[i]};
}
LL nl = seg[0].first, nr = seg[0].second;
for(int i = 1; i < n; ++i) {
if(nr < seg[i].first || nl > seg[i].second) return false;
nr = min(nr, seg[i].second);
nl = max(nl, seg[i].first);
}
return nr >= nl;
};
while(l < r) {
LL mid = (l + r) >> 1;
if(check(mid)) r = mid;
else l = mid + 1;
}
cout<<r<<"\n";
}
}