#include<iostream>
#include<cstdio>
#include<cmath>
#include<algorithm>
#define le p<<1
#define ri (p<<1)|1
#define N 500000
#define int long long
using namespace std;
int n,d,a[N+10],t[(N<<2)+10];
void tree_up(int p){
t[p]=max(t[le],t[ri]);
}
void tree_update(int p,int l,int r,int x,int k){
if(l==r&&l==x){
t[p]=max(t[p],k);
return ;
}
int mid=(l+r)>>1;
if(x<=mid) tree_update(le,l,mid,x,k);
else tree_update(ri,mid+1,r,x,k);
tree_up(p);
}
int tree_find(int p,int l,int r,int x,int y){
if(x<=l&&r<=y){
return t[p];
}
int mid=(l+r)>>1,maxn=-1;
if(x<=mid) maxn=max(maxn,tree_find(le,l,mid,x,y));
if(mid<y) maxn=max(maxn,tree_find(ri,mid+1,r,x,y));
return maxn;
}
signed main(){
cin>>n>>d;
for(int i=1;i<=n;i++){
cin>>a[i];
}
for(int i=1;i<=n;i++){
int l=a[i]-d,r=a[i]+d;
if(l<=0) l=1;
if(r>500000) r=500000;
tree_update(1,1,N,a[i],tree_find(1,1,n,l,r)+1);
}
cout<<tree_find(1,1,N,1,N)<<endl;
return 0;
}
样例1能过,剩下两个过不了。
RE#2
经过排查,大概是if(mid<y) maxn=max(maxn,tree_find(ri,mid+1,r,x,y));这句惹的祸,但是好像没问题。