Description

Anna 在一个游乐园工作。她负责建造一个新的过山车铁路。她已经设计了影响过山车速度的 nn 个特殊的路段(方便起见标记为 00 到 n−1n−1)。现在 Anna 必须要把这些特殊的路段放在一起并提出一个过山车的最后设计。为了简化问题,你可以假设过山车的长度为零。

对于 00 和 n−1n−1 之间的每个 ii,这个特殊的路段 ii 具有如下两个性质:

当进入这个路段时,有一个速度限制:过山车的速度必须小于或等于 sisi km/h(每小时千米),

当离开这个路段时,过山车的速度刚好是 titi km/h,不管过山车进入该路段时的速度如何。

最后完成的过山车设计是一个以某种顺序包含这 nn 个特殊路段的单一铁路线。这 nn 个路段中的每一个应当被使用刚好一次。连续的路段之前用铁轨来连接。Anna 应该选择这 nn 个路段的顺序,然后确定每段铁轨的长度。铁轨的长度以米来衡量,可以是任意的非负整数(可以为零)。

两个特殊路段之间的每 11 米铁轨可以将过山车的速度减慢 11 km/h。在这个过山车铁路的起点,过山车按照 Anna 选择的顺序进入第一个特殊路段时的速度是 11 km/h。

最后的设计还必须满足以下要求:

过山车在进入这些特殊路段时不能违反任一个速度限制;

过山车的速度在任意时刻为正。

在所有子任务中(子任务 33 除外),你的任务是找出这些路段之间铁轨的最小可能总长度(这些路段之间铁轨总长度的最小值)。对于子任务 33 你只需要检查是否存在一个有效的过山车设计,使得每段铁轨的长度为零。

Solution

我们可以把这个过程看成速度的起落,于是我们把速度离散成点

对于每组\((s_i,t_i)\),\(s_i->t_i\)连边,这样形成很多条边

我们可以把速度的变化看作这个图中的一条欧拉路,这样也得先满足欧拉路的条件

经过每一段区间 \([x,x+1]\) 的向左的边和向右的边的差的绝对值不超过\(1\)(因为这是一个反复横跳的过程)

这样我们就得到了每一个点的度数 \(in[i]\) (向左-向右的边数)

如果 \(in[i]<0\) 我们要做的是让速度变慢,那么就加入 \(in[i]\)条代价为 \(x_i-x_{i-1}\) 的边,从而满足度数条件

如果 \(in[i]>0\) 因为速度增大是不需要代价的,所以直接把度数变成 \(0\) 即可

所以前面一部分相当于是把有交的边先处理好(同一个连通块)

最后由于图要连通,所以再做一遍最小生成树,实质是构造出不同连通块的摆放顺序,使得代价最小

#include<bits/stdc++.h>
#include "railroad.h"
using namespace std;
typedef long long ll;
const int N=400005;
int n,b[N],num=0,m,fa[N],sum[N];
inline int find(int x){return fa[x]==x?x:fa[x]=find(fa[x]);}
struct sub{
int x,y,z;
bool operator <(const sub &p)const{return z<p.z;}
}e[N];
long long plan_roller_coaster(std::vector<int> s, std::vector<int> t) {
n = (int) s.size();
for(int i=0;i<n;i++)b[++num]=s[i],b[++num]=t[i];
sort(b+1,b+num+1);m=unique(b+1,b+num+1)-b-1;
for(int i=1;i<=m;i++)fa[i]=i;
for(int i=0;i<n;i++){
s[i]=lower_bound(b+1,b+m+1,s[i])-b;
t[i]=lower_bound(b+1,b+m+1,t[i])-b;
fa[find(t[i])]=find(s[i]);
sum[s[i]]--,sum[t[i]]++;
}
int cnt=0;ll ans=0;
sum[1]++;sum[m]--;
if(find(1)!=find(m))fa[find(m)]=find(1);
for(int i=m;i>1;i--){
if(sum[i]){
if(sum[i]>0)ans+=1ll*sum[i]*(b[i]-b[i-1]);
sum[i-1]+=sum[i];fa[find(i)]=find(i-1);
}
e[++cnt]=(sub){i-1,i,b[i]-b[i-1]};
}
sort(e+1,e+cnt+1);
for(int i=1;i<=cnt;i++){
int x=e[i].x,y=e[i].y;
if(find(x)==find(y))continue;
fa[find(y)]=find(x);
ans+=e[i].z;
}
return ans;
}

UOJ #236. 【IOI2016】railroad的更多相关文章

  1. uoj #58. 【WC2013】糖果公园(树上莫队算法+修改操作)

    [题目链接] http://uoj.ac/problem/58 [题意] 有一棵树,结点有自己的颜色,若干询问:u,v路径上的获益,并提供修改颜色的操作. 其中获益定义为Vc*W1+Vc*W2+…+V ...

  2. uoj #5. 【NOI2014】动物园 kmp

    #5. [NOI2014]动物园 Time Limit: 20 Sec Memory Limit: 256 MB 题目连接 http://uoj.ac/problem/5 Description 近日 ...

  3. UOJ #148. 【NOIP2015】跳石头 二分

    #148. [NOIP2015]跳石头 Time Limit: 20 Sec Memory Limit: 256 MB 题目连接 http://uoj.ac/problem/148 Descripti ...

  4. UOJ#7. 【NOI2014】购票 | 线段树 凸包优化DP

    题目链接 UOJ #7 题解 首先这一定是DP!可以写出: \[f[i] = \min_{ancestor\ j} \{f[j] + (d[j] - d[i]) * p[i] + q[i]\}\] 其 ...

  5. UOJ #17. 【NOIP2014】飞扬的小鸟 背包DP

    #17. [NOIP2014]飞扬的小鸟 Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 4902  Solved: 1879 题目连接 http:// ...

  6. UOJ#130 【NOI2015】荷马史诗 K叉哈夫曼树

    [NOI2015]荷马史诗 链接:http://uoj.ac/problem/130 因为不能有前缀关系,所以单词均为叶子节点,就是K叉哈夫曼树.第一问直接求解,第二问即第二关键字为树的高度. #in ...

  7. UOJ#126【NOI2013】快餐店

    [NOI2013]快餐店 链接:http://uoj.ac/problem/126 YY了一个线段树+类旋转卡壳的算法.骗了55分.还比不上$O(n^2)$暴力T^T 题目实际上是要找一条链的两个端点 ...

  8. UOJ#122【NOI2013】树的计数

    [NOI2013]树的计数 链接:http://uoj.ac/problem/122 按BFS序来,如果$B_i$与$B_{i-1}$必须在同一层,那么贡献为0,必须在不同层那么贡献为1,都可以贡献为 ...

  9. [UOJ#24]【IOI2014】Rail

    #24. [IOI2014]Rail 台湾有一个连接着岛的东.西两岸的庞大的铁路线.这个铁路线包含有 mm 个区段.这些相连的区段以数字 0,…,m−10,…,m−1 为编号,且编号由西端开始.每一个 ...

随机推荐

  1. 第一次作业:扑通扑通 我的IT

    让我掉下眼泪的不止昨夜的酒,还有这满屏的代码. 第一部分:结缘计算机 你为什么选择计算机专业?你认为你的条件如何?和这些博主比呢? 在炎炎的夏日,伴随这高三的结束,我也面临大学专业的选择,我看着书里密 ...

  2. servlet线程同步问题-代码实现同步(转)

    从servlet的生命周期中,我们知道,当第一次访问某个servlet后,该servlet的实例就会常驻 内存,以后再次访问该servlet就会访问同一个servlet实例,这样就带来多个用户去访问一 ...

  3. 《高级软件测试》11.16.Jira使用说明的撰写和操作视频的录制

    今日任务完成情况如下: 小王:完成了测试管理工具jira的使用手册中,基本情况介绍.下载安装部分的撰写工作:小高:参考官方手册,结合自己的实际使用体会,对jira的基本组成及其工作流程进行了介绍:小陈 ...

  4. Unix下zfs文件系统重组RAID-5后可以这样恢复

    存储做的RAID-5, SCSI硬盘,操作系统是FreeBSD,文件系统是zfs.本案例共有12块硬盘,11块硬盘里有数据,1块硬盘是热备盘.其中第6块数据硬盘出现故障,重组时需要将其剔除. 物理盘: ...

  5. linux下安装配置jdk(解压版)

    在linux下登录oracle官网,下载解压版jdk    传送门 系统默认下载到"下载"目录中 创建要将该文件解压的文件夹: 其中 -p 参数代表递归创建文件夹(可以创建多级目录 ...

  6. linux查看文件内容的常见命令

    1.cat命令,显示文件的所有内容,内容过多则显示最后一屏一般用于内容较少文件 2.more命令,分页显示文件的内容一般用于文件内容过多的文件,回车显示下一行,空格显示下一页,q/Q退出 3.head ...

  7. sublime的使用技巧

    ctr+shift+d是复制当前行当下一行2.使用Sublime text 3 编写代码是一种享受,使用Sublime text 3 格式化HTML代码,需要安装插件,具体安装步骤如下:1.打开菜单- ...

  8. io文本加密

    文本加密习题 package io; import java.io.BufferedReader; import java.io.BufferedWriter; import java.io.Inpu ...

  9. Sudoku 第一步

    看到这个问题的思路是先解决生成数独生成器的编写,然后再解决数独求解的问题.最开始第一想法就是暴力求解,仔细算一下复杂度,发现这肯定耗时很久,于是看了很多博客(见转载).我们用回溯搜出来正解.

  10. 一张图说明 Web Api 参数绑定默认规则

    请求如下: 控制器如下: 慎重说明:不管请求方式是 get 还是 post , 简单类型的参数,如 name 和 id ,其值都是从 url 里面去取. Web API 从 url 还是 body 获 ...