Submission #1187987

#TimeUsernameProblemLanguageResultExecution timeMemory
1187987esomerBouquet (EGOI24_bouquet)C++20
100 / 100
66 ms15888 KiB
#include <bits/stdc++.h> using namespace std; struct segTree { vector<int> v; int sz; void init (int n) { sz = 1; while (sz < n) sz *= 2; v.assign(2 * sz, 0); } void set(int i, int val, int x, int lx, int rx) { if (rx - lx == 1) { v[x] = max(v[x], val); return; } int m = (lx + rx) / 2; if (i < m) set(i, val, 2 * x + 1, lx, m); else set(i, val, 2 * x + 2, m, rx); v[x] = max(v[2 * x + 1], v[2 * x + 2]); } void set(int i, int val) { set(i, val, 0, 0, sz); } int calc(int l, int r, int x, int lx, int rx) { if (lx >= l && rx <= r) return v[x]; else if (lx >= r || rx <= l) return 0; int m = (lx + rx) / 2; return max(calc(l, r, 2 * x + 1, lx, m), calc(l, r, 2 * x + 2, m, rx)); } int calc(int l, int r) { return calc(l, r, 0, 0, sz); } }; int main() { ios_base::sync_with_stdio(0); cin.tie(0); int N; cin >> N; vector<int> l(N), r(N); for (int i = 0; i < N; i++) cin >> l[i] >> r[i]; vector<vector<int>> upd(N); //all the nodes that have to be updated when I calc node i. for (int i = 0; i < N; i++) { if (i - l[i]- 1 >= 0) upd[i - l[i] - 1].push_back(i); } vector<int> dp(N, 0); segTree st; st.init(N+1); int ans = 0; for (int i = 0; i < N; i++) { ans = max(ans, dp[i] + 1); st.set(min(N, i + r[i] + 1), dp[i] + 1); for (int x : upd[i]) { dp[x] = st.calc(0, x+1); } } cout << ans << "\n"; }
#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...