题解 CF1409E 【Two Platforms】

6 篇文章 0 订阅

写篇题解庆祝我第 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;
}
  • 4
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值