Attachments - 2024 National Invitational of CCPC (Zhengzhou), 2024 CCPC Henan Provincial Collegiate Programming Contest - Codeforces
将公式转换:
∣ 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";}
}