戦闘力を 以上にできるかという判定問題を考えます。
についてソートをしておくと、各 について、
スピードを 以上にするための を二分探索で求めることができます。
さらに、あらかじめ 区間 max を計算しておくことにより、 についても 以上を達成できるかを判定することができます。
以上により、判定問題を で解くことができたので、
全体の計算量は となり、十分高速にこの問題を解くことができました。
#include <bits/stdc++.h> using namespace std; int main(){ int n; cin >> n; vector<int> a(n), b(n); for(int i = 0; i < n; i++){ cin >> a[i] >> b[i]; } vector<pair<int, int>> c(n); for(int i = 0; i < n; i++){ c[i] = make_pair(a[i], b[i]); } sort(a.begin(), a.end()); sort(c.begin(), c.end()); vector<int> mx(n + 1); for(int i = n - 1; i >= 0; i--){ mx[i] = max(mx[i + 1], c[i].second); } long long ng = 2e9, ok = -1; while(abs(ok - ng) > 1){ long long mid = (ok + ng) / 2; bool check = false; for(int i = 0; i < n; i++){ int j = lower_bound(a.begin(), a.end(), mid - c[i].first) - a.begin(); j = max(j, i + 1); if(j >= n){ continue; } long long sumB = c[i].second + mx[j]; if(sumB >= mid){ check = true; break; } } if(check){ ok = mid; }else{ ng = mid; } } cout << ok << endl; }