求助,到底错哪里了
查看原帖
求助,到底错哪里了
877271
legolas7楼主2024/4/11 23:49

WA了一个晚上,求调悬关

#include <cstdio>
#include <iostream>
#include <algorithm>
#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){
		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=0; 
	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;
}
int 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/11 23:49
加载中...