戦闘力を 以上にできるかという判定問題を考えます。
についてソートをしておくと、各 について、
スピードを 以上にするための を二分探索で求めることができます。
さらに、あらかじめ 区間 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;
}