Submission #1155789

#TimeUsernameProblemLanguageResultExecution timeMemory
1155789njoopBouquet (EGOI24_bouquet)C++20
100 / 100
100 ms9472 KiB
#include <bits/stdc++.h> #define ti tuple<int, int, int> using namespace std; int n, l[200010], r[200010], mx, val, ans; priority_queue<ti, vector<ti>, greater<ti>> pq; struct st { vector<int> seg; void init() { seg.assign(1200000, 0); } void update(int l, int r, int idx, int val, int node) { if(l == r) { seg[node] = max(seg[node], val); return; } int mid = (l+r)/2; if(idx <= mid) update(l, mid, idx, val, node*2); else update(mid+1, r, idx, val, node*2+1); seg[node] = max(seg[node*2], seg[node*2+1]); } int query(int l, int r, int ql, int qr, int node) { if(ql > r || qr < l) return -1; if(l >= ql && r <= qr) return seg[node]; int mid = (l+r)/2; return max(query(l, mid, ql, qr, node*2), query(mid+1, r, ql, qr, node*2+1)); } }; int main() { cin.tie(0)->sync_with_stdio(0); st seg; seg.init(); cin >> n; for(int i=1; i<=n; i++) { while(pq.size() && get<0>(pq.top()) <= i) { seg.update(1, n, get<1>(pq.top()), get<2>(pq.top()), 1); pq.pop(); } cin >> l[i] >> r[i]; if(i-l[i]-1 > 0) mx = seg.query(1, n, 1, i-l[i]-1, 1); else mx = 0; pq.push({i+r[i]+1, i, mx+1}); } while(pq.size()) { seg.update(1, n, get<1>(pq.top()), get<2>(pq.top()), 1); pq.pop(); } cout << seg.query(1, n, 1, n, 1); }
#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...