#include <iostream>
#include <cmath>
#include <queue>
using namespace std;
#define f first
#define s second
int main(){
ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);
// freopen("input.in","r",stdin);
int N; cin>>N;
int dp[N];
int zp=1<<(int)ceil(log2(N));
int arb[2*zp];
pair<int,int> fl[N];
for(int i=0;i<N;i++){
cin>>fl[i].f>>fl[i].s;
}
for(int i=0;i<2*zp;i++){
arb[i]=0;
}
priority_queue<pair<int,int>> pq; // end flower index
int id,v,pos;
int l,r;
for(int i=0;i<N;i++){
if(i-fl[i].f<=0){
dp[i]=1;
}
else{
while(!pq.empty() && (pq.top().f)*-1<i){
id=pq.top().s;
v=dp[id];
pos=id + zp;
arb[pos]=max(arb[pos],v);
pos/=2;
while(pos>=1){
arb[pos]=max(arb[pos+pos],arb[pos+pos+1]);
pos/=2;
}
pq.pop();
}
v=0; l=zp; r=zp+i-fl[i].f-1;
while(l<=r){
if(l%2==1){
v=max(v,arb[l]);
l++;
}
if(r%2==0){
v=max(v,arb[r]);
r--;
}
r/=2;
l/=2;
}
dp[i]=1+v;
}
pq.push({-1*(i+fl[i].s),i});
}
int m=0;
for(int i=0;i<N;i++){
m=max(m,dp[i]);
}
cout<<m;
}
# | 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... |