제출 #1190099

#제출 시각아이디문제언어결과실행 시간메모리
1190099ofozBouquet (EGOI24_bouquet)C++20
100 / 100
111 ms16828 KiB
#include <bits/stdc++.h> using namespace std; #define pi pair<int, int> #define vi vector<int> void update(int v, int tl, int tr, int p, int k, vector<int>& tree) { if (tl == tr) tree[v] = k; else { int tm = (tl+tr)/2; if (p <= tm) update(2*v, tl, tm, p, k, tree); else update(2*v+1, tm+1, tr, p, k, tree); tree[v] = max(tree[2*v], tree[2*v+1]); } } int query(int v, int tl, int tr, int l, int r, vector<int>& tree) { if (l > r) return 0; if (tl == l && tr == r) return tree[v]; int tm = (tl+tr)/2; int a = query(2*v, tl, tm, l, min(r, tm), tree), b = query(2*v+1, tm+1, tr, max(tm+1, l), r, tree); return max(a, b); } void solve() { int n; cin >> n; vector<pi> seg; for (int i = 0; i < n; i++) { int l, r; cin >> l >> r; seg.push_back(make_pair(l, r)); } vector<int> dp(n, 1), tree(4*n, 0); vector<vi> upd(n, vi()); int mx = 1; for (int i = 0; i < n; i++) { int l, r; tie(l, r) = seg[i]; dp[i] = query(1, 0, n-1, 0, i - l - 1, tree) + 1; mx = max(mx, dp[i]); upd[min(i + r, n-1)].push_back(i); for (int j : upd[i]) { update(1, 0, n-1, j, dp[j], tree); } } cout << mx << endl; } signed main() { ios_base::sync_with_stdio(0); cin.tie(0); solve(); }
#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...