题解 CF875E Delivery Club

Posted colazcy

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了题解 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;
}

以上是关于题解 CF875E Delivery Club的主要内容,如果未能解决你的问题,请参考以下文章

CF875EDelivery Club 二分+线段树

E. Mishap in Club (CF 245E)

题解 CF1063B Labyrinth

CF Round #631 题解

CF886E 题解

CF524B 题解