传送门


将“进入路段时速度\(\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;
}

UOJ236 IOI2016 Railroad 差分、欧拉回路、最小生成树的更多相关文章

  1. 【UOJ#236】[IOI2016]railroad(欧拉回路,最小生成树)

    [UOJ#236][IOI2016]railroad(欧拉回路,最小生成树) 题面 UOJ 题解 把速度看成点,给定的路段看成边,那么现在就有了若干边,然后现在要补上若干边,以及一条\([inf,\) ...

  2. 【欧拉回路+最小生成树】SD开车@山东2018省队一轮集训day1

    目录 [欧拉回路+最小生成树]SD开车@山东2018省队一轮集训day1 PROBLEM 题目描述 输入 输出 样例输入 样例输出 提示 SOLUTION CODE [欧拉回路+最小生成树]SD开车@ ...

  3. [JZOJ 5895] [NOIP2018模拟10.5] 旅游 解题报告 (欧拉回路+最小生成树)

    题目链接: https://jzoj.net/senior/#main/show/5895 题目: 题解: 有一个好像比较显然的性质,就是每条边最多经过两次 那么我们考虑哪些边需要经过两次.我们把需要 ...

  4. CF1120D Power Tree(构造题,差分,最小生成树)

    很有趣的一道题. 首先可以对每个叶子进行编号.按照DFS到的顺序即可.(假设从 $1$ 到 $k$) 然后对每个点求出它管辖的所有叶子的编号.因为是DFS序所以这一定是个区间.设点 $u$ 的这个区间 ...

  5. P6628-[省选联考 2020 B 卷] 丁香之路【欧拉回路,最小生成树】

    正题 题目链接:https://www.luogu.com.cn/problem/P6628 题目大意 给出\(n\)个点的一张完全无向图,\(i\sim j\)的边权是\(|i-j|\). 然后给出 ...

  6. NITACMOJ144稳定串

    点我>>题目链接 稳定串 Time Limit: 1000ms Memory Limit: 65536KB 64-bit integer IO format: %lld      Java ...

  7. NOIP考点

    NOIP考点 基础算法 图 树 数论 数据结构 动态规划 搜索 其他算法 省选知识点汇总 图论 数据结构 字符串相关算法及数据结构 数学 计算几何 搜索 动态规划 其他算法 转自:巨佬的博客 加*号是 ...

  8. 全国青少年信息学奥林匹克分区联赛(N)竞赛大纲

    全国青少年信息学(计算机)奥林匹克分区联赛竞赛大纲 一.初赛内容与要求:(#表示普及组不涉及,以下同) 计算机的基本发展 诞生与发展 特点 在现代社会中的应用 计算机系统的基本组成 计算机的工作原理# ...

  9. OI知识点|NOIP考点|省选考点|教程与学习笔记合集

    点亮技能树行动-- 本篇blog按照分类将网上写的OI知识点归纳了一下,然后会附上蒟蒻我的学习笔记或者是我认为写的不错的专题博客qwqwqwq(好吧,其实已经咕咕咕了...) 基础算法 贪心 枚举 分 ...

随机推荐

  1. Android 组件的三种点击事件写法

    一.准备工作 1.项目结构 2.布局文件(activity_main.xml) <?xml version="1.0" encoding="utf-8"? ...

  2. java基础(一)---数据类型&Math方法&强制转换

    数据类型及各种Math类方法 public class HelloWorld { public static void main(String args[]) { //各种数据类型的熟悉掌握,强制类型 ...

  3. c++预声明类引发的无法解析外部符号问题

    在VisualStudio下开发C++程序常遇到链接问题就是:LNK2019 无法解析外部符号. 这个问题一般我们认为是没有将引用的代码链接到当前项目造成,也有例外,就是下面我要说的预声明类导致的. ...

  4. katalon之web文件上传

    参考:https://docs.katalon.com/katalon-studio/docs/webui-upload-file.html#example- 适用范围:tag=input, type ...

  5. C#计算时间差 TimeSpan

    TimeSpan的相关属性 Add:与另一个TimeSpan值相加. Days:返回用天数计算的TimeSpan值. Duration:获取TimeSpan的绝对值. Hours:返回用小时计算的Ti ...

  6. 一、JSP标签介绍,自定义标签

    一.JSP标签介绍 1. 标签库有什么作用 自定义标签库是一种优秀的表现层技术,之前介绍的MVC模式,我们使用jsp作为表现层,但是jsp语法嵌套在html页面,美工还是很难直接参与开发,并且jsp脚 ...

  7. PHP is much better than you think

    Rants about PHP are everywhere, and they even come from smart guys.When Jeff Atwood wrote yet anothe ...

  8. java实现支付宝支付及退款(一)

    本篇博客主要做支付宝支付的准备工作(注册沙箱.natapp内网穿透等操作).具体代码实现操作请看下篇博客 一.登录沙箱 1.登录蚂蚁金服开发平台: https://open.alipay.com/pl ...

  9. SpringCloud之初识Feign ----- 分布式负载自动拼接请求的URL

    在前面的学习中,我们使用了Ribbon的负载均衡功能,大大简化了远程调用时的代码: String baseUrl = "http://user-service/user/"; Us ...

  10. IntelliJ IDEA LicenseServer激活及使用

    一.激活 IntelliJ IDEA下载地址:https://www.jetbrains.com/idea/download/#section=windows 原文地址:http://blog.csd ...