题解 CF875E 【Delivery Club】

题目链接

Solution CF875E

题目大意:两个快递员初始在(s1,s2)位置,给定(n)个位置,每次从两人中选择一人移动到给定位置,求两人最大距离最小值

解析:

最大距离最小启示我们二分

然后考虑维护可行位置集合

每次要移动到一个新位置时把集合中不合法的先前位置剔除,这个可以用set完成
,如果中途set为空则不合法

复杂度:(O(nlog^2n))

注意初始两位置也要计入答案

#include <iostream>
#include <set>
using namespace std;
const int maxn = 1e5 + 100;
int n,s1,s2,l,ans,r = 0x3f3f3f3f,val[maxn];
inline bool check(int limit){
	set<int> s;
	s.insert(s1),s.insert(s2);
	for(int i = 1;i <= n;i++){
		while(!s.empty() && abs(*s.begin() - val[i]) > limit)s.erase(s.begin());
		while(!s.empty() && abs(*prev(s.end()) - val[i]) > limit)s.erase(prev(s.end()));
		if(s.empty())return false;
		s.insert(val[i]);
	}
	return true;
}
int main(){
	cin >> n >> s1 >> s2;
	l = abs(s1 - s2);//就是这儿
	for(int i = 1;i <= n;i++)cin >> val[i];
	while(l <= r){
		int mid = (l + r) >> 1;
		if(check(mid))ans = mid,r = mid - 1;
		else l = mid + 1;
	}
	cout << ans << endl;
	return 0;
}
原文地址:https://www.cnblogs.com/colazcy/p/12234731.html