【UOJ#236】[IOI2016]railroad(欧拉回路,最小生成树)
【UOJ#236】[IOI2016]railroad(欧拉回路,最小生成树)
题面
题解
把速度看成点,给定的路段看成边,那么现在就有了若干边,然后现在要补上若干边,以及一条\([inf,\)使得原图存在欧拉回路,那么就变成了求从大往小连边的边长的最小值。
而欧拉回路每个点被来回覆盖的次数左右一定是一样的,假设向右-向左覆盖的次数为\(g_i\),那么如果\(g_i>0\),花费\(1\)的代价向\(i-1\)连边,如果\(g_i>0\),那么则可以不花费代价连边\(i\rightarrow i+1\)。
看起来这样子得到了一个解,实际上欧拉回路还需要满足连通性,再求一遍\(MST\)把图连通就行了。
#include<iostream>
#include<cstdio>
#include<algorithm>
#include"railroad.h"
using namespace std;
#define MAX 400200
#define ll long long
int S[MAX<<2],top,cnt,c[MAX];
int f[MAX];int getf(int x){return x==f[x]?x:f[x]=getf(f[x]);}
struct Line{int u,v,w;}e[MAX];
bool operator<(Line a,Line b){return a.w<b.w;}
long long plan_roller_coaster(vector<int> s,vector<int> t)
{
int n=s.size();ll ans=0;
for(int i=0;i<n;++i)S[++top]=s[i],S[++top]=t[i];
S[++top]=-1e9-100;S[++top]=1e9+100;
sort(&S[1],&S[top+1]);top=unique(&S[1],&S[top+1])-S-1;
for(int &i:s)i=lower_bound(&S[1],&S[top+1],i)-S;
for(int &i:t)i=lower_bound(&S[1],&S[top+1],i)-S;
c[2]=-1;c[top]=1;for(int i=1;i<=top;++i)f[i]=i;
for(int i=0;i<n;++i)c[s[i]+1]++,c[t[i]+1]--;
for(int i=0;i<n;++i)f[getf(s[i])]=getf(t[i]);
for(int i=1;i<=top;++i)c[i]+=c[i-1];
for(int i=2;i<=top;++i)
{
if(c[i]==0)continue;
if(c[i]>0)ans+=1ll*c[i]*(S[i]-S[i-1]);
f[getf(i)]=getf(i-1);
}
for(int i=2;i<top-1;++i)if(getf(i)!=getf(i+1))e[++cnt]=(Line){i,i+1,S[i+1]-S[i]};
sort(&e[1],&e[cnt+1]);
for(int i=1;i<=cnt;++i)
if(getf(e[i].u)!=getf(e[i].v))
f[getf(e[i].u)]=getf(e[i].v),ans+=e[i].w;
return ans;
}
【UOJ#236】[IOI2016]railroad(欧拉回路,最小生成树)的更多相关文章
- 【欧拉回路+最小生成树】SD开车@山东2018省队一轮集训day1
目录 [欧拉回路+最小生成树]SD开车@山东2018省队一轮集训day1 PROBLEM 题目描述 输入 输出 样例输入 样例输出 提示 SOLUTION CODE [欧拉回路+最小生成树]SD开车@ ...
- UOJ #236. 【IOI2016】railroad
Description Anna 在一个游乐园工作.她负责建造一个新的过山车铁路.她已经设计了影响过山车速度的 nn 个特殊的路段(方便起见标记为 00 到 n−1n−1).现在 Anna 必须要把这 ...
- UOJ236 IOI2016 Railroad 差分、欧拉回路、最小生成树
传送门 将"进入路段时速度\(\leq s_i\)"转换为:"进入路段时速度恰好等于\(s_i\),并且铺设铁轨有加速和减速两种,加速无需代价,减速每\(1 km/h\) ...
- [JZOJ 5895] [NOIP2018模拟10.5] 旅游 解题报告 (欧拉回路+最小生成树)
题目链接: https://jzoj.net/senior/#main/show/5895 题目: 题解: 有一个好像比较显然的性质,就是每条边最多经过两次 那么我们考虑哪些边需要经过两次.我们把需要 ...
- P6628-[省选联考 2020 B 卷] 丁香之路【欧拉回路,最小生成树】
正题 题目链接:https://www.luogu.com.cn/problem/P6628 题目大意 给出\(n\)个点的一张完全无向图,\(i\sim j\)的边权是\(|i-j|\). 然后给出 ...
- wawawa8的模板复习计划
wawawa8的模板复习计划 数据结构 //手写堆 [link][https://www.luogu.org/problemnew/show/P3378] //并查集 [link][https://w ...
- 全国青少年信息学奥林匹克分区联赛(N)竞赛大纲
全国青少年信息学(计算机)奥林匹克分区联赛竞赛大纲 一.初赛内容与要求:(#表示普及组不涉及,以下同) 计算机的基本发展 诞生与发展 特点 在现代社会中的应用 计算机系统的基本组成 计算机的工作原理# ...
- UOJ#117. 欧拉回路
#117. 欧拉回路 题目描述 有一天一位灵魂画师画了一张图,现在要你找出欧拉回路,即在图中找一个环使得每条边都在环上出现恰好一次. 一共两个子任务: 这张图是无向图.(50分) 这张图是有向图.(5 ...
- 暑假集训2016day3T1 欧拉回路(UOJ #117欧拉回路)(史上最全的欧拉回路纯无向图/有向图解析)
原题……可惜不会……真是一只大蒟蒻…… ———————————————————————————————— 有一天一位灵魂画师画了一张图,现在要你找出欧拉回路,即在图中找一个环使得每条边都在环上出现恰好 ...
随机推荐
- 01-VMware-workstation14安装
VMware-workstation14安装步骤: 首先现在虚拟机wmware,我现在的版本是:VMware-workstation-full-14.1.1.28517.exe 到处这里就安装完成: ...
- Java 读取配置文件数据
Properties类 Properties类,是一个工具类,包含在java.util包中. 功能:可以保存持久的属性,通常用来读取配置文件或者属性文件,将文件中的数据读入properties对象中, ...
- C# DataTable详解
添加引用 using System.Data; 创建表 //创建一个空表 DataTable dt = new DataTable(); //创建一个名为"Table_New"的空 ...
- IdentityServer4【QuickStart】之设置和概述
设置和概述 有两个基本的方式来开启一个新的IdentityServer项目: 从头开始 从asp.net Identity模板开始 如果你从头开始,我们提供了一些基于内存中构建的存储,所以你不必一开始 ...
- Java 数据库简单操作类
数据库操作类,将所有连接数据库的配置信息以及基本的CRUD操作封装在一个类里,方便项目里使用,将连接数据库的基本信息放在配置文件 "dbinfo.properties" 中,通过类 ...
- Git SSH公钥配置
https://www.cnblogs.com/smuxiaolei/p/7484678.html https://blog.csdn.net/weixin_42063071/article/deta ...
- mysql修改默认端口号后从windows命令行登录
mysql -u root -p -P 大写的P代表端口号,小写的p代表密码
- js 首次进入弹窗
今天有个需求,首次进入需要弹窗,然后就在网上找了下,虽然看了很多但是说的都不是我想要的,最后终于到了一个合适的. function get_cookie(Name) { var search = Na ...
- mycat - 水平分表
相对于垂直拆分的区别是:垂直拆分是把不同的表拆到不同的数据库中,而水平拆分是把同一个表拆到不同的数据库中.水平拆分不是将表的数据做分类,而是按照某个字段的某种规则来分散到多个库之中,每个表中包含一部分 ...
- ArcGIS 添加 MarkerSymbol 弹出“图形符号无法序列化为 JSON”错误
今天在做一个demo,向自定义图层中添加MarkerSymbol的时候,弹出“图形符号无法序列化为 JSON”错误,之前都没有出现过这个问题,我们首先来看一看我是怎样去添加图层,然后向图层中添加Gra ...