Submission #1229910

#TimeUsernameProblemLanguageResultExecution timeMemory
1229910FIFI_cppBouquet (EGOI24_bouquet)C++17
100 / 100
79 ms15688 KiB
#include<bits/stdc++.h>
using namespace std;

#define sp <<' '<<
#define se second
#define fi first
#define pb push_back

#define FOR(i,a) for(int i=0;i<(a);i++)
#define FORE(i,a,b) for(int i=(a);i<(b);i++)

#define DEBUG(x) cout<<#x sp x<<endl

#define mid (l+r)/2

typedef vector<int> vi;
typedef pair<int,int> pii;
typedef vector<pii> vii;

const int MAXN=2e5+5;

int deg[MAXN];

vi tut[MAXN];

vii a;

int n;
int t[MAXN*4];

void up(int pos,int val,int nd=1,int l=1,int r=n){
    if(l==r){
        t[nd]=val;
        return;
    }

    if(pos<=mid) up(pos,val,nd*2,l,mid);
    else up(pos,val,nd*2+1,mid+1,r);

    t[nd]=max(t[nd*2],t[nd*2+1]);
}

int qu(int ql,int qr,int nd=1,int l=1,int r=n){
    if(l>r or l>qr or r<ql) return 0;
    if(ql<=l and r<=qr){
        return t[nd];
    }

    auto s1=qu(ql,qr,nd*2,l,mid);
    auto s2=qu(ql,qr,nd*2+1,mid+1,r);

    return max(s1,s2);
}

signed main(){
    ios_base::sync_with_stdio(false);
    cin.tie(0);cout.tie(0);
    
    cin>>n;
    
    a.resize(n+1);

    FORE(i,1,n+1){
        cin>>a[i].fi>>a[i].se;
    }

    int ans=1;

    FORE(i,1,n+1){
        for(auto el:tut[i]){
            up(el,deg[el]);
        }

        deg[i]=1;
        if(i-a[i].fi-1>0){
            deg[i]=max(deg[i],qu(1,i-a[i].fi-1)+1);
        }
        if(i+a[i].se+1<=n) tut[i+a[i].se+1].pb(i);

        ans=max(ans,deg[i]);
    }

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