zoukankan      html  css  js  c++  java
  • 题解 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;
    }
    
  • 相关阅读:
    几种简单的博弈 1
    Luogu P2789 直线交点数
    搜索题简记
    并查集的妙用
    [qbzt寒假]线段树和树状数组
    [qbzt寒假]hash
    [qbzt寒假]Trie字典树
    博客阅读须知
    洛谷P1842 [USACO05NOV]奶牛玩杂技——题解
    2020SDOI游记
  • 原文地址:https://www.cnblogs.com/colazcy/p/12234731.html
Copyright © 2011-2022 走看看