제출 #337262

#제출 시각아이디문제언어결과실행 시간메모리
337262boykut금 캐기 (IZhO14_divide)C++14
0 / 100
1 ms364 KiB
#include <bits/stdc++.h> using namespace std; #define int long long #define MAXN 100000 int x[MAXN], g[MAXN], d[MAXN], n; int prg[MAXN], prd[MAXN]; bool can (int LEN) { for (int left = 0; left < n; left ++) { int right = lower_bound(x, x + n, x[left] + LEN) - x; if (right >= 0 && right < n) if (prd[right] - (left == 0 ? 0 : prd[left - 1]) >= x[right] - x[left]) { return true; } right = upper_bound(x, x + n, x[left] - LEN) - x - 1; if (right >= 0 && right < n) { if (prd[left] - (right == 0 ? 0 : prd[right - 1]) >= x[left] - x[right]) { return true; } } } return false; } signed main() { //ios::sync_with_stdio(0); //cin.tie(0); cin >> n; for (int i = 0; i < n; i++) { cin >> x[i] >> g[i] >> d[i]; } for (int i = 0; i < n; i++) { prg[i] = g[i]; prd[i] = d[i]; if (i) prg[i] += prg[i - 1], prd[i] += prd[i - 1]; } int l = 0, r = 1000000000; while (l < r) { int LEN = (l + r + 1) / 2; if (can (LEN)) { l = LEN; } else { r = LEN - 1; } //cout << l << ' ' << r << '\n'; } int ans = 0, LEN = l; for (int left = 0; left < n; left ++) { int right = lower_bound(x, x + n, x[left] + LEN) - x; //cout << left << ' ' << right << '\n'; if (right >= 0 && right < n) if (prd[right] - (left == 0 ? 0 : prd[left - 1]) >= x[right] - x[left]) { ans = max(ans, prg[right] - (left == 0 ? 0 : prg[left - 1])); } right = upper_bound(x, x + n, x[left] - LEN) - x - 1; if (right >= 0 && right < n) { if (prd[left] - (right == 0 ? 0 : prd[right - 1]) >= x[left] - x[right]) { ans = max(ans, prg[left] - (right == 0 ? 0 : prg[right - 1])); } } } cout << ans << '\n'; return 0; }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...