Codeforces - Delivery Club

题目链接:Codeforces - Delivery Club


首先二分最长距离。

然后按照任务顺序,加入点到set当中。

对于当前点,排序无用的点,也就是距离a[i]大于mid 的点。如果某一时刻set为空则无解,否则有解。

为什么只要不为空就有解呢?因为只要不为空证明存在一个位置到当前点的距离小于等于mid,我们提前让另一个人到达即可。


AC代码:

#pragma GCC optimize("-Ofast","-funroll-all-loops")
#include<bits/stdc++.h>
//#define int long long
using namespace std;
const int N=1e5+10;
int n,s1,s2,l,r=1e9,a[N];
inline int check(int mid){
	set<int> s;	s.insert(s1),s.insert(s2);
	for(int i=1;i<=n;i++){
		while(s.size()&&abs(a[i]-*s.begin())>mid)	s.erase(s.begin());
		while(s.size()&&abs(a[i]-*(--s.end()))>mid)	s.erase(--s.end());
		if(!s.size())	return 0;
		s.insert(a[i]);
	} 
	return 1;
}
signed main(){
	cin>>n>>s1>>s2;	l=abs(s1-s2);
	for(int i=1;i<=n;i++)	scanf("%d",&a[i]);
	while(l<r){
		int mid=l+r>>1;
		if(check(mid))	r=mid;
		else	l=mid+1;
	}
	cout<<l;
	return 0;
}
发布了579 篇原创文章 · 获赞 242 · 访问量 4万+

猜你喜欢

转载自blog.csdn.net/weixin_43826249/article/details/104284870