两块板不好考虑考虑一块板,然后用前缀后缀推到两块板
int x[MX];
int suf[MX],pre[MX];//末端放在第i个,最多接多少//前端放在第i个,最多接多少
int mx[MX];//pre的后缀最大
void solve()
{
int n,k,tmp;cin>>n>>k;
rpp(i,n)
{
cin>>x[i];
suf[i] = pre[i] = mx[i] = 0;
}
rpp(i,n) cin>>tmp;
sort(x+1,x+1+n);
int l = 1,r = n;
suf[1] = 1;
for(int i = 2;i<=n;++i)
{
while(x[i]-x[l]>k) ++l;
suf[i] = i-l+1;
}
pre[n] = 1;
for(int i = n-1;i>=1;--i)
{
while(x[r]-x[i]>k) --r;
pre[i] = r-i+1;
}
mx[n] = pre[n];
for(int i=n-1;i>=1;--i)
mx[i] = max(pre[i],mx[i+1]);
int ans = 1;
rpp(i,n-1)
ans = max(ans,suf[i]+mx[i+1]);
cout<<ans<<endl;
}