• UOJ236 IOI2016 Railroad 差分、欧拉回路、最小生成树


    传送门


    将“进入路段时速度(leq s_i)”转换为:“进入路段时速度恰好等于(s_i),并且铺设铁轨有加速和减速两种,加速无需代价,减速每(1 km/h)花费(1)的代价”。

    将所有路段((s_i,t_i))变为图上的一条边((s_i , t_i)),然后加上一条((INF , 1))边,我们要求的就是一条代价最小的经过所有这些边的欧拉回路。

    先对于所有速度离散化,然后考虑一段区间([v_i , v_{i+1})),在欧拉回路中从左往右经过它的次数应该等于从右往左经过的次数。先用差分维护一下每一段区间从左往右和从右往左经过的次数,然后给这段区间加上从左往右或者从右往左的若干条边并计算贡献。

    加好边了之后可能会存在若干个连通块,但题目要求图联通。这个时候加入的边一定会是相邻两个速度之间的边,所以把这些边拿出来跑最小生成树即可。

    #include<vector>
    #include<algorithm>
    using namespace std;
    
    const int MAXN = 4e5 + 7;
    int N;
    vector < int > lsh;
    int cf[MAXN] , fa[MAXN];
    struct Edge{
    	int s , t , w;
    	bool operator <(const Edge a)const{return w < a.w;}
    }Ed[MAXN];
    
    int find(int x){return fa[x] == x ? x : (fa[x] = find(fa[x]));}
    
    long long plan_roller_coaster(vector<int> s, vector<int> t){
    	lsh.insert(lsh.end() , s.begin() , s.end());
    	lsh.insert(lsh.end() , t.begin() , t.end());
    	lsh.push_back(1);
    	sort(lsh.begin() , lsh.end());
    	auto it = unique(lsh.begin() , lsh.end());
    	int len = it - lsh.begin();
    	for(int i = 1 ; i < len ; ++i) fa[i] = i;
    	for(int i = 0 ; i < s.size() ; ++i){
    		int p = lower_bound(lsh.begin() , it , s[i]) - lsh.begin() , q = lower_bound(lsh.begin() , it , t[i]) - lsh.begin();
    		++cf[p]; --cf[q];
    		fa[find(p)] = find(q);
    	}
    	--cf[0];
    	long long sum = 0;
    	int cnt = 0;
    	for(int i = 0 ; i < len ; ++i){
    		if(i) cf[i] += cf[i - 1];
    		if(cf[i] > 0){
    			fa[find(i)] = find(i + 1);
    			sum += 1ll * cf[i] * (lsh[i + 1] - lsh[i]);
    		}
    		else if(cf[i] == 0)  Ed[++cnt] = (Edge){i , i + 1 , lsh[i + 1] - lsh[i]};
    		else fa[find(i)] = find(i + 1);
    	}
    	sort(Ed + 1 , Ed + cnt + 1);
    	for(int i = 1 ; i <= cnt ; ++i)
    		if(find(Ed[i].s) != find(Ed[i].t)){
    			fa[find(Ed[i].s)] = find(Ed[i].t);
    			sum += Ed[i].w;
    		}
    	return sum;
    }
    
  • 相关阅读:
    「四步接入」开启秀场直播,揭秘七牛云互动直播解决方案
    【直播预告】揭秘互动直播,技术咖携手美女主播解读直播背后那点事儿
    初识k8s(基础概念加历史了解)(一)
    Linux lsof命令的使用示例
    Linux netstat:查看网络状态
    Linux uname命令:查看系统和内核相关信息
    系统环境变量PATH的设置与查看,以Mac为例
    Shell echo命令
    Linux which命令
    【转译】每个Python开发者都应该掌握的8种数据结构
  • 原文地址:https://www.cnblogs.com/Itst/p/10464523.html
Copyright © 2020-2023  润新知