Submission #1234069

#TimeUsernameProblemLanguageResultExecution timeMemory
1234069yixuan19Bouquet (EGOI24_bouquet)C++20
8 / 100
50 ms19900 KiB
#include <iostream>
#include <utility>
#include <vector>
#include <algorithm>
using namespace std;

const int decalage = (1<<18);
int tab[2*decalage];
void modify(int ind, int new_val){
    tab[ind] = new_val;
    while (ind > 1){
        ind/=2;
        tab[ind] = max(tab[ind*2], tab[ind*2+1]);
    }
}

int query(int l, int r){
    if (l == r) return tab[l];
    if (l%2 == 1){
        return max(tab[l], query(l+1,r));
    }
    if (r%2 == 0){
        return max(tab[r], query(l,r-1));
    }
    return query(l/2,r/2);
}

int main(){
    ios::sync_with_stdio(false);
    cin.tie(NULL);
    cout.tie(NULL);
    int N, l, r;
    cin >> N;
    int skipped = 0;
    int ans = 0;
    vector<pair<int,int> > tulips;
    vector<vector<pair<int,int> > > add (N*2);
    for (int i = 0; i < N; ++i){
        cin >> l >> r;
        tulips.push_back(make_pair(l,r));
    }
    int dp[N];
    int maxi = 0;
    for (int i = 0; i < N; ++i){
        dp[i] = 0;
    }
    
    for (int i = 0; i < N; ++i){
        // for (auto s: add){
        //     for (auto p: s){
        //         cout<<p.first<<' '<<p.second<<' ';
        //     }
        //     cout<<endl;
        // }
        if (add[i].size() > 0){
            for (auto p: add[i]){
                modify(p.first+decalage,dp[p.first]);
            }
        }
        // for (int i = decalage; i < decalage+N; ++i){
        //     cout<<tab[i]<<' ';
        // }
        // cout<<endl;
        
        // cout<<"querying "<<i<<" 0 to "<<max(i-tulips[i].first-1,0)<<endl;
        // cout<<"result "<<query(decalage,max(i-tulips[i].first-1,0) + decalage)<<endl;
        dp [i] = query(decalage,max(i-tulips[i].first-1,0) + decalage) + 1;
        add[tulips[i].second + i +1].push_back(make_pair(i,dp [i]));
        // for (int i = 0; i < N; ++i){
        //     cout<<dp[i]<<' ';
        // }
        // cout<<endl;
        // cout<<endl;
    }

    maxi = 0;
    // for (int i = 0; i < N; ++i){
    //     cout<<dp[i]<<' ';
    // }
    // cout<<endl;
    for (int i = 0; i < N; ++i ){
        maxi = max(maxi, dp[i]);
    }
    cout<<maxi<<endl;
}
#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...