제출 #529703

#제출 시각아이디문제언어결과실행 시간메모리
529703Alex_tz307금 캐기 (IZhO14_divide)C++17
48 / 100
1016 ms9268 KiB
#include <bits/stdc++.h> using namespace std; const int kN = 1e5; int x[1 + kN], g[1 + kN], e[1 + kN]; int64_t sum[1 + kN]; void maxSelf(int64_t &x, int64_t y) { if (x < y) { x = y; } } struct ST { int n; vector<int64_t> t, lazy; ST(int N) : n(N) { int dim = 1; while (dim < n) { dim *= 2; } dim *= 2; t.resize(dim); lazy.resize(dim); } void updateNode(int x, int64_t v) { t[x] += v; lazy[x] += v; } void push(int x) { if (lazy[x] == 0) { return; } for (int i = 0; i < 2; ++i) { updateNode(x * 2 + i, lazy[x]); } lazy[x] = 0; } void update(int x, int lx, int rx, int st, int dr, int64_t v) { if (st <= lx && rx <= dr) { updateNode(x, v); return; } push(x); int mid = (lx + rx) / 2; if (st <= mid) { update(x * 2, lx, mid, st, dr, v); } if (mid < dr) { update(x * 2 + 1, mid + 1, rx, st, dr, v); } t[x] = max(t[x * 2], t[x * 2 + 1]); } void update(int st, int dr, int64_t v) { if (dr < st) { return; } update(1, 1, n, st, dr, v); } int64_t query(int x, int lx, int rx, int st, int dr) { if (st <= lx && rx <= dr) { return t[x]; } push(x); int mid = (lx + rx) / 2; int64_t ans = -1; if (st <= mid) { maxSelf(ans, query(x * 2, lx, mid, st, dr)); } if (mid < dr) { maxSelf(ans, query(x * 2 + 1, mid + 1, rx, st, dr)); } return ans; } int64_t query(int st, int dr) { if (dr < st) { return -1; } return query(1, 1, n, st, dr); } }; bool check(int n, int64_t k) { ST t(n); int l = 0; for (int r = 1; r <= n; ++r) { t.update(1, r - 1, e[r] - (x[r] - x[r - 1])); t.update(r, r, e[r]); while (l + 1 <= r && sum[r] - sum[l] >= k) { l += 1; } if (t.query(1, l) >= 0) { return true; } } return false; } void testCase() { int n; cin >> n; for (int i = 1; i <= n; ++i) { cin >> x[i] >> g[i] >> e[i]; sum[i] = sum[i - 1] + g[i]; } int64_t l = 0, r = 1e14L; while (l <= r) { int64_t mid = (l + r) / 2; if (check(n, mid)) { l = mid + 1; } else { r = mid - 1; } } cout << l - 1 << '\n'; } int main() { ios_base::sync_with_stdio(false); cin.tie(nullptr); int tests = 1; for (int tc = 0; tc < tests; ++tc) { testCase(); } return 0; }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...