E. Two Platforms
这题还是有一些细节的…
题意:
有两块长k的板子,可以在任意整数座标水平放置,问最多有多少小球的投影在板子上
首先注意到所有小球只关系它的 座标,与 座标无关
因为同样的 座标,板子的 座标肯定无穷小(能接住所有掉下来的小球)
所以现在问题是两段长k的线段,最多能覆盖多少点?
#include <bits/stdc++.h>
using namespace std;
#define int long long
const int maxn=2e5+10;
int a[maxn],b[maxn],c[maxn],pre[maxn];
bool com( int a,int b){
return a<b;
}
int qian[maxn],hou[maxn];
signed main()
{
int t,n,k;
cin >> t;
while( t-- )
{
cin >> n >> k;
for(int i=1;i<=n;i++) cin >> a[i];
for(int i=1;i<=n;i++) cin >> b[i];
sort(a+1,a+1+n,com);
for(int i=n;i>=1;i--)
{
int nowx=a[i]+k;//从第i个小球开始覆盖,最远可以覆盖到nowx
int index=upper_bound(a+1,a+1+n,nowx)-a;//刚好大于nowx的索引
hou[i]=max( hou[i+1],index-i );//取max,因为数组hou[i]的含义是从[i,n]任选一个小球开始覆盖的最优值
}
int ans=0;
for(int i=1;i<=n;i++)//枚举第一块木板从i位置开始覆盖
{
int nowx=a[i]+k;
int index=upper_bound(a+1,a+1+n,nowx)-a;//刚好大于nowx的索引
ans=max( ans,hou[index]+(index-i) );
}
cout << ans << endl;
for(int i=0;i<=n+1;i++) hou[i]=0;
}
}