#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 time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |