写篇题解庆祝我第 1 1 1 次参加 d i v 3 div3 div3,而且还 A K AK AK 了
我们发现 y y y 坐标越低越好,所以答案与 y y y 坐标无关。
现在问题等价于一条数轴上有 n n n 个点,求 2 2 2 条线段覆盖尽可能多的点.
首先,有 2 2 2 个结论:
- 2 2 2 条线段重叠明显是不优的,我们就需要让这两条无重叠。
- 线段的至少 1 1 1 的端点要是 n n n 个点当中的一个,这样显然会比线段 2 2 2 段都不是 n n n 个中的一个的要优。
这样就可以了
代码:
int work(){
memset(f,0,sizeof(f));
memset(g,0,sizeof(g));
memset(k,0,sizeof(k));
int n,k;read(n);read(k);
for(int i=1;i<=n;i++)read(a[i]);
for(int i=1;i<=n;i++)read(b[i]);
sort(a+1,a+n+1);//不要忘了排序
for(int i=1;i<=n;i++)f[i]=i-(lower_bound(a+1,a+n+1,a[i]-k)-a)+1;//以第i个点为左端点
for(int i=n;i;i--)p[i]=upper_bound(a+1,a+n+1,a[i]+k)-a-i;//以第i个点为右端点
for(int i=1;i<=n;i++)g[i]=max(g[i-1],f[i]);
for(int i=n;i;i--)::k[i]=max(::k[i+1],p[i]);
int ans=0;
for(int i=1;i<=n+1;i++)ans=max(ans,g[i-1]+::k[i]);
cout<<ans<<endl;
return 0;
}