Submission #585664

#TimeUsernameProblemLanguageResultExecution timeMemory
585664ShinDivide and conquer (IZhO14_divide)C++14
100 / 100
52 ms8628 KiB
#include <bits/stdc++.h> #define fi first #define se second #define mp make_pair #define all(x) x.begin(), x.end() using namespace std; template <class X, class Y> bool minimize(X &a, Y b) { if (a > b) return a = b, true; return false; } template <class X, class Y> bool maximize(X &a, Y b) { if (a < b) return a = b, true; return false; } struct items { int x; long long g, d; items() { d = g = x = 0; } }; struct segment_tree { vector<long long> mx; int n; segment_tree(int _n) : n(_n) { mx.assign((n << 2) + 7, -(long long) 1e18); } void modify(int id, int l, int r, int p, long long v) { if (l > p || r < p) { return; } if (l == r) { mx[id] = v; } else { int mid = (l + r) >> 1; modify(id << 1, l, mid, p, v); modify(id << 1|1, mid + 1, r, p, v); mx[id] = max(mx[id << 1], mx[id << 1|1]); } } int get(int id, int l, int r, long long k) { if (l == r) { return (mx[id] < k ? -1: l); } int mid = (l + r) >> 1; if (mx[id << 1] >= k) { return get(id << 1, l, mid, k); } return get(id << 1|1, mid + 1, r, k); } void modify(int p, int v) { modify(1, 1, n, p, v); } int get(long long k) { return get(1, 1, n, k); } }; const int N = 1e5 + 7; int n; items a[N]; signed main() { cin.tie(0)->sync_with_stdio(0); cin >> n; for (int i = 1; i <= n; i ++) { cin >> a[i].x >> a[i].g >> a[i].d; a[i].g += a[i - 1].g; a[i].d += a[i - 1].d; } long long res = 0; segment_tree st(n); for (int i = 1; i <= n; i ++) { st.modify(i, a[i].x - a[i - 1].d); int pos = st.get(a[i].x - a[i].d); if (pos != -1) { maximize(res, a[i].g - a[pos - 1].g); } } cout << res; return 0; }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...