Submission #1138992

#TimeUsernameProblemLanguageResultExecution timeMemory
1138992vincentbucourt1Bouquet (EGOI24_bouquet)C++20
100 / 100
88 ms13748 KiB
#include <bits/stdc++.h> using namespace std; void fastIO() {ios_base::sync_with_stdio(false),cin.tie(0);} #define int long long #define f first #define s second const int MAXN = 2e5 + 20; int N; pair<int,int> vals[MAXN]; int ans = 0; struct Segtree { int numLeaves = 0; vector<int> tree; Segtree(){} Segtree(int n) { numLeaves = 1; while (numLeaves < n) numLeaves *= 2; tree.assign(2*numLeaves, 0); } int query (int l, int r) { l += numLeaves, r += numLeaves+1; if (l > r) { return 0; } int res = 0; while (l < r) { if (l&1) { res = max(res, tree[l++]); } if (r&1) { res = max(res, tree[--r]); } l /= 2; r /= 2; } return res; } void update (int idx, int val) { idx += numLeaves; tree[idx] = max(tree[idx], val); idx /= 2; while (idx > 0) { tree[idx] = max(tree[2*idx], tree[2*idx+1]); idx /= 2; } } }; signed main() { fastIO(); cin >> N; for (int i = 0; i < N; i++) { int l, r; cin >> l >> r; vals[i] = {l,r}; } priority_queue<pair<int,pair<int,int>>, vector<pair<int,pair<int,int>>>, greater<pair<int,pair<int,int>>>> PQ; Segtree ds(N+20); for (int i = 0; i < N; i++) { while (!PQ.empty() && PQ.top().f < i) { ds.update(PQ.top().s.s, PQ.top().s.f); PQ.pop(); } int best = ds.query(0, i - vals[i].f - 1); PQ.push({i + vals[i].s, {best+1, i}}); ans = max(ans, best+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...