Submission #678144

#TimeUsernameProblemLanguageResultExecution timeMemory
678144AlcabelBigger segments (IZhO19_segments)C++17
100 / 100
127 ms35276 KiB
#include <bits/stdc++.h> using namespace std; const long long inf = 1e18; struct SegTree { int n; long long st[1 << 21]; SegTree() {} SegTree(int _n) { if (_n == 1) { n = 1; } else { n = (1 << (31 - __builtin_clz(_n - 1) + 1)); } for (int i = 0; i < 2 * n; ++i) { st[i] = inf; } } void assign(int v, int tl, int tr, int i, long long val) { if (tl + 1 == tr) { st[v] = val; return; } int m = tl + (tr - tl) / 2; if (i < m) { assign(2 * v, tl, m, i, val); } else { assign(2 * v + 1, m, tr, i, val); } st[v] = min(st[2 * v], st[2 * v + 1]); } void assign(int i, long long val) { assign(1, 0, n, i, val); } int getRightmost(int v, int tl, int tr, long long val) { if (tl + 1 == tr) { return tl; } int m = tl + (tr - tl) / 2; if (st[2 * v + 1] <= val) { return getRightmost(2 * v + 1, m, tr, val); } return getRightmost(2 * v, tl, m, val); } int getRightmost(long long val) { return getRightmost(1, 0, n, val); } ~SegTree() {} }; void solve() { int n; cin >> n; vector<int> a(n); vector<long long> pref(n + 1); for (int i = 0; i < n; ++i) { cin >> a[i]; pref[i + 1] = pref[i] + a[i]; } vector<pair<int, long long>> f(n + 1); f[0] = {0, 0}; SegTree st(n + 1); st.assign(0, 0); for (int i = 1; i <= n; ++i) { int j = st.getRightmost(pref[i]); // cerr << "i: " << i << ", j: " << j << '\n'; f[i] = {f[j].first + 1, pref[i] - pref[j]}; st.assign(i, pref[i] + f[i].second); } cout << f[n].first << '\n'; } int main() { ios_base::sync_with_stdio(0); cin.tie(0); cout.tie(0); int T = 1; // cin >> T; while (T--) { solve(); } return 0; }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...