Submission #915422

#TimeUsernameProblemLanguageResultExecution timeMemory
915422n3rm1nDivide and conquer (IZhO14_divide)C++17
17 / 100
2 ms2396 KiB
#include<bits/stdc++.h> #define endl '\n' using namespace std; const int MAXN = 1e5+10; void speed() { ios_base::sync_with_stdio(false); cin.tie(NULL); cout.tie(NULL); } int n; int x[MAXN], gold[MAXN], energy[MAXN]; long long a[MAXN], pref[MAXN]; void read() { cin >> n; for (int i = 1; i <= n; ++ i) { cin >> x[i] >> gold[i] >> energy[i]; a[i] = a[i-1]; pref[i] = pref[i-1] + gold[i]; if(i > 1)a[i] -= x[i] - x[i-1]; a[i] += energy[i]; } } int t[MAXN * 4]; int lazy[MAXN * 4]; int inf = -1; void make_tree(int i, int l, int r) { if(l == r) { t[i] = a[l]; // cout << l << " " << r << " " << a[l] << endl; return; } int mid = (l + r)/2; make_tree(2*i, l, mid); make_tree(2*i+1, mid+1, r); t[i] = max(t[2*i], t[2*i+1]); } void push_lazy(int i, int l, int r) { t[i] += lazy[i]; if(l != r) { lazy[2*i] += lazy[i]; lazy[2*i+1] += lazy[i]; } lazy[i] = 0; } int ql, qr, val; void update(int i, int l, int r) { push_lazy(i, l, r); if(qr < l || ql > r)return; if(ql <= l && r <= qr) { lazy[i] = val; push_lazy(i, l, r); return; } int mid = (l + r)/2; update(2*i, l, mid); update(2*i+1, mid+1, r); t[i] = max(t[2*i], t[2*i+1]); } int xx; void clear_update(int i, int l, int r) { if(l == r) { t[i] = -1; return; } int mid = (l + r)/2; if(xx <= mid)clear_update(2*i, l, mid); else clear_update(2*i+1, mid+1, r); t[i] = max(t[2*i], t[2*i+1]); } int query(int i, int l, int r) { push_lazy(i, l, r); if(l == r) { if(t[i] >= 0)return l; else return -1; } int mid = (l + r)/2; push_lazy(2*i, l, mid); push_lazy(2*i+1, mid + 1, r); int tleft = t[2*i], tright = t[2*i+1]; if(tright >= 0)return query(2*i+1, mid+1, r); else return query(2*i, l, mid); } int main() { speed(); read(); make_tree(1, 1, n); long long ans = 0; for (int starter = 1; starter <= n; ++ starter) { long long index = query(1, 1, n); // cout << index << endl; if(index == -1)continue; long long sol = pref[index] - pref[starter-1]; ans = max(ans, sol); long long change = -energy[starter]; if(starter < n)change += x[starter+1] - x[starter]; ql = starter + 1; qr = n; val = change; if(ql <= qr) update(1, 1, n); xx = starter; clear_update(1, 1, n); } cout << ans << endl; return 0; }

Compilation message (stderr)

divide.cpp: In function 'int query(int, int, int)':
divide.cpp:93:9: warning: unused variable 'tleft' [-Wunused-variable]
   93 |     int tleft = t[2*i], tright = t[2*i+1];
      |         ^~~~~
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...