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...