悬关求调
  • 板块灌水区
  • 楼主legolas7
  • 当前回复0
  • 已保存回复0
  • 发布时间2024/4/12 22:58
  • 上次更新2024/4/13 09:58:05
查看原帖
悬关求调
877271
legolas7楼主2024/4/12 22:58

原题传送门

#include <cstdio>
#include <iostream>
#include <algorithm>
#define int long long
#define N 500000
#define le p<<1
#define ri (p<<1)|1
using namespace std;
int n,d,ai[N],t[(N<<2)+10];
void up(int p){
	t[p]=max(t[le],t[ri]);
}
void change(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) change(le,l,mid,x,k);
	else change(ri,mid+1,r,x,k);
	up(p);
}
int query(int p,int l,int r,int x,int y){
	if(x<=l&&r<=y){
		return t[p];
	}
	int mid=(l+r)>>1,mx=-1;
	if(x<=mid) mx=max(mx,query(le,l,mid,x,y));
	if(y>mid) mx=max(mx,query(ri,mid+1,r,x,y));
	return mx;
}
signed main(){
	cin>>n>>d;
	for(int i=1;i<=n;i++){
		cin>>ai[i];
//		maxn=max(maxn,ai[i]);
	}
	for(int i=1;i<=n;i++){
		int l=ai[i]-d,r=ai[i]+d;
		if(l<=0) l=1;
		if(r>500000) r=500000;
		change(1,1,N,ai[i],query(1,1,N,l,r)+1);
	}
	cout<<query(1,1,N,1,N)<<'\n';
	return 0;
}
2024/4/12 22:58
加载中...