线段树板题玄学RE求助
查看原帖
线段树板题玄学RE求助
877767
hhhppp楼主2024/4/20 21:21
#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));这句惹的祸,但是好像没问题。

2024/4/20 21:21
加载中...