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;
}