Submission #1194769

#TimeUsernameProblemLanguageResultExecution timeMemory
1194769DeathIsAweBouquet (EGOI24_bouquet)C++20
100 / 100
136 ms15688 KiB
#include <bits/stdc++.h>
#define pb push_back
#define mp make_pair
#define ff first
#define ss second
#define ll long long
using namespace std;
int segment[524288], dp[200000];


void seginsert(int val, int pos) {
    pos += 262144;
    segment[pos] = val;
    pos /= 2;
    while (pos > 0) {
        segment[pos] = max(segment[pos*2 + 1], segment[pos*2]);
        pos /= 2;
    }
}


int segquery(int l, int r) {
    l += 262144; r += 262144;
    int val = 0;
    while (l <= r) {
        if (l % 2 == 1) {val = max(val, segment[l++]);}
        if (r % 2 == 0) {val = max(val, segment[r--]);}
        l /= 2; r /= 2;
    }
    return val;
}


int main() {
    int n; cin >> n;
    vector<pair<int,int>> ranges(n);
    for (int i=0;i<n;i++) {
        cin >> ranges[i].ff >> ranges[i].ss;
    }


    vector<vector<int>> ends(n + 1);
    for (int i=0;i<n;i++) {
        ends[min(ranges[i].ss + i + 1, n)].pb(i);
    }
    for (int i=0;i<524288;i++) {
        segment[i] = 0;
    }
    

    int tempdp;
    dp[0] = 1;
    for (int i=1;i<n;i++) {
        for (int j: ends[i]) {
            seginsert(dp[j], j);
        }

        dp[i] = 1 + segquery(0, i - ranges[i].ff - 1);
    }


    int ans = 0;
    for (int i=0;i<n;i++) {
        ans = max(ans, dp[i]);
    }
    cout << ans;
}
#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...