제출 #1188599

#제출 시각아이디문제언어결과실행 시간메모리
1188599ofozBouquet (EGOI24_bouquet)C++20
70 / 100
3095 ms34872 KiB
#include <bits/stdc++.h> using namespace std; #define int long long const int INF = numeric_limits<int>::max(); struct Node { int min_val, max_val, max_dp; }; void update(int v, int tl, int tr, int i, vector<Node>& tree, const vector<pair<int, int>>& segments, const vector<int>& dp) { if (tl == tr) { tree[v] = {tl, tl, dp[tl]}; } else { int tm = (tl + tr) / 2; if (i <= tm) update(2 * v, tl, tm, i, tree, segments, dp); else update(2 * v + 1, tm + 1, tr, i, tree, segments, dp); tree[v] = { min(tree[2 * v].min_val, tree[2 * v + 1].min_val), max(tree[2 * v].max_val, tree[2 * v + 1].max_val), max(tree[2 * v].max_dp, tree[2 * v + 1].max_dp) }; } } int query(int v, int tl, int tr, int x, const vector<Node>& tree) { if (x <= tree[v].min_val) return 0; if (x > tree[v].max_val) return tree[v].max_dp; int tm = (tl + tr) / 2; int a = query(2 * v, tl, tm, x, tree); int b = query(2 * v + 1, tm + 1, tr, x, tree); return max(a, b); } void solve() { int n; cin >> n; vector<Node> tree(4 * n, {INF, INF, -1}); vector<int> dp(n, 1); vector<pair<int, int>> segments(n); for (int i = 0; i < n; ++i) { int l, r; cin >> l >> r; segments[i] = {l, r}; } vector<vector<int>> upd(n); for (int i = 0; i < n; ++i) { int l = segments[i].first; int r = segments[i].second; int mx_j = query(1, 0, n - 1, i - l, tree); dp[i] = max(dp[i], mx_j + 1); upd[min(n - 1, i + r)].push_back(i); for (int j : upd[i]) { update(1, 0, n - 1, j, tree, segments, dp); } } cout << *max_element(dp.begin(), dp.end()) << endl; } signed main() { 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...