Submission #172775

#TimeUsernameProblemLanguageResultExecution timeMemory
172775tselmegkhDivide and conquer (IZhO14_divide)C++14
100 / 100
292 ms6772 KiB
#include<bits/stdc++.h> using namespace std; const int N = 1e5 + 5; int x[N], g[N], d[N]; bool vis[N]; long long tree[4 * N], lazy[4 * N], pref[N]; void push(int v, int l, int r, int val){ if(l != r){ lazy[v * 2] += val; lazy[v * 2 + 1] += val; } tree[v] += val; lazy[v] = 0; } void update(int v, int l, int r, int ql, int qr, int val){ if(l > r)return; push(v, l, r, lazy[v]); if(ql > r || qr < l)return; if(ql <= l && qr >= r){ push(v, l, r, val); return; } int mid = (l + r) / 2; update(v * 2, l, mid, ql, qr, val); update(v * 2 + 1, mid + 1, r, ql, qr, val); tree[v] = max(tree[v * 2], tree[v * 2 + 1]); } int get(int v, int l, int r){ push(v, l, r, lazy[v]); if(l == r)return l; int mid = (l + r) / 2; if(tree[v * 2] + lazy[v * 2] >= 0){ return get(v * 2, l, mid); } return get(v * 2 + 1, mid + 1, r); } int main(){ int n; cin >> n; for(int i = 1; i <= n; i++){ cin >> x[i] >> g[i] >> d[i]; pref[i] = pref[i - 1] + g[i]; } long long ans = 0; for(int i = 1; i <= n; i++){ if(i > 1)update(1, 1, n, 1, i - 1, x[i - 1] - x[i]); update(1, 1, n, 1, i, d[i]); int l = get(1, 1, n); ans = max(ans, pref[i] - pref[l - 1]); } cout << ans << '\n'; }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...