Submission #1220863

#TimeUsernameProblemLanguageResultExecution timeMemory
1220863overwatch9Bouquet (EGOI24_bouquet)C++20
100 / 100
213 ms15292 KiB
#include <bits/stdc++.h> using namespace std; bool comp(pair <int, int> a, pair <int, int> b) { return a.second < b.second; } struct stree { #define lc v*2 #define rc v*2+1 vector <int> tree; stree (int s) { tree.resize(s*4); } void pushup(int v) { tree[v] = max(tree[lc], tree[rc]); } void update(int v, int tl, int tr, int p, int val) { if (tl > p || tr < p) return; if (tl == tr) { tree[v] = val; return; } int tm = (tl + tr) / 2; update(lc, tl, tm, p, val); update(rc, tm+1, tr, p, val); pushup(v); } int query(int v, int tl, int tr, int l, int r) { if (tl > r || tr < l) return 0; if (tl >= l && tr <= r) return tree[v]; int tm = (tl + tr) / 2; int a = query(lc, tl, tm, l, r); int b = query(rc, tm+1, tr, l, r); return max(a, b); } }; int main() { int n; cin >> n; vector <pair <int, int>> nums(n+1); for (int i = 1; i <= n; i++) { cin >> nums[i].first >> nums[i].second; } vector <int> dp(n+1); // let dp[i] = maximum number of tulips that may be picked if the ith tulip is def picked multiset <pair <int, int>> expiry; stree tree(n); for (int i = 1; i <= n; i++) { while (!expiry.empty() && expiry.begin()->first == i) { int id = expiry.begin()->second; expiry.erase(expiry.begin()); tree.update(1, 1, n, id, dp[id]); } int l = i - nums[i].first - 1; dp[i] = max(1, tree.query(1, 1, n, 1, l) + 1); // for (int j = l; j >= 1; j--) { // int r = j + nums[j].second + 1; // if (r <= i) // dp[i] = max(dp[i], dp[j] + 1); // } expiry.insert({i + nums[i].second + 1, i}); } cout << *max_element(dp.begin(), dp.end()) << '\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...