#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 time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |