Submission #1189539

#TimeUsernameProblemLanguageResultExecution timeMemory
1189539prideliqueeeBouquet (EGOI24_bouquet)C++20
24 / 100
87 ms13320 KiB
#include<bits/stdc++.h>
using namespace std;
#define int long long
#define f first
#define s second
pair<int,int> mx[800000];
int ri[200010];
void update(int l,int r,int i,int index)
{
    if(index<l||index>r)
    return;
    if(l==r)
    {
        mx[i]={ri[l],ri[l]};
        return;
    }
    int mid=(l+r)/2;
    update(l,mid,i*2,index);
    update(mid+1,r,i*2+1,index);
    mx[i]={min(mx[i*2].f,mx[i*2+1].f),mx[i*2+1].s};
}
int sum;
void query(int l,int r,int i,int ql,int qr,int val)
{
    if(qr<l||ql>r)
    return;
    if(ql<=l&&qr>=r)
    {
        if(mx[i].s<=val)
        {   
            sum=max(sum,r);
            return;
        }
    }
    if(mx[i].f>val)
    return;
    int mid=(l+r)/2;
    if(mx[i*2+1].f<=val)
    query(mid+1,r,i*2+1,ql,qr,val);
    if(mx[i*2].f<=val)
    query(l,mid,i*2,ql,qr,val);
}
signed main()
{
    ios_base::sync_with_stdio(0);
    cin.tie(0);
    int n;
    cin>>n;
    int li[n+1];
    for(int i=1;i<=n;i++)
    {
        int l,r;
        cin>>l>>r;
        li[i]=max((int)0,i-l-1);
        ri[i]=min(n+1,i+r+1);
        int j=li[i];
        update(0,n,1,i);
        sum=0;
        query(0,n,1,0,li[i],i);
        li[i]=sum;
    }
    int ans[n+1];
    memset(ans,0,sizeof ans);
    for(int i=1;i<=n;i++)
    {
        ans[i]=ans[i-1];
        int d=li[i];
        ans[i]=max(ans[i],ans[d]+1);
        //cout<<ri[i]<<" "<<li[i]<<" "<<ans[i]<<endl;
    }
    cout<<ans[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...