传送门


将“进入路段时速度\(\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 RecycleView多种布局实现(工厂模式)

    RecycleView是个很常用的控件,很多APP中都可以看到它的身影,同时它也是个很难用的控件,主要就难在多种布局的实现. 在<第一行代码—Android>这本书里边有个RecycleV ...

  2. 制作OTA升级包

    OTA 软件包工具 本文地址http://wossoneri.github.io/2018/09/21/%5BAndroid%5D%5BFramework%5Dcreate-ota-update-zi ...

  3. 整理一些.net core中的错误代码

    在hosting .net core时,有些错误代码并不容易理解. 作为标记,方便查询,这些错误代码可能不会出现在VS的错误查找工具里,也不会出现在错误代码转字符描述的函数里. COR_E_AMBIG ...

  4. JavaScript中的原型链和继承

    理解原型链 在 JavaScript 的世界中,函数是一等公民. 上面这句话在很多地方都看到过.用我自己的话来理解就是:函数既当爹又当妈."当爹"是因为我们用函数去处理各种&quo ...

  5. ECS服务器搭建Discuz 邮箱设置,报错处理

    背景 自己想做个网站,没那么多精力,然后就看到了discuz.万网买了一个月的ecs Windows server 2008 r2 服务器,就开始着手安装环境.论坛! 建站 第一次使用discuz论坛 ...

  6. [20181225]12CR2 SQL Plan Directives.txt

    [20181225]12CR2 SQL Plan Directives.txt --//12C引入SQL PLAN Directives.12cR1版本会造成大量的动态取样,影响性能.许多人把OPTI ...

  7. CVE-2017-8464 分析

    目录 CVE-2017-8464(stuxnet 3.0) 分析 0xFF 前言 0x00 分析工具 0x01 漏洞复现 1).生成一个DLL用于测试 2).构造一个恶意的lnk二进制文件 3).RU ...

  8. Ubuntu下启动 Redis时, 提示 "Can't open the log file: Permission denied failed"

    问题来源:在删除var目录下的log文件时,将redis文件夹删除了.然后在重启时:/etc/init.d/redis-server start,提示: Starting redis-server: ...

  9. Qt的事件

    Qt的事件机制 事件过滤器: 可以让一个对象侦听拦截另外一个对象的事件. 实现原理: 在所有Qt对象的基类:QObject中有一个 类型为:QObjectList 名字为:eventFilters 的 ...

  10. LeetCode算法题-Invert Binary Tree

    这是悦乐书的第194次更新,第199篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第55题(顺位题号是226).反转二叉树.例如: 输入: 4 / \ 2 7 / \ / ...