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

猜你喜欢

转载自www.cnblogs.com/colazcy/p/12234731.html