题目

描述

题目大意

在一个数轴上,有些人要从某个点到达另一个点。

出租车从最左端出发,将所有人送到它们的目的地,最终到达最右边的点。

出租车只能做一个乘客,并且可以在图中将乘客丢下。

问最短时间。


思考历程

一看就觉得是神仙题,

往DP方向思考,没有一点点长进……

压根就没有想过贪心……

然而这题又没得打暴力,于是一分都没有拿。


正解

面对这种神仙题,为什么我没有想到贪心……

首先将有用功加入答案中。

出租车走过的路径一定连在一起的,如果我们添加一条从MMM到000的路径,就能保证它最终能到达MMM点。这样路径就构成了一个环。

可以通过各个点将数轴分成很多段,每一段上有一些往左走的路,有一些往右走的路。

大多时候这些向左走和向右走的路径条数是不一样的,但我们求的是环(欧拉回路)。

于是我们相减,取绝对值,强制添加路径。

这样搞出来之后可能不会连通,但由于有条从MMM到000的路径,如果不连通,一定可以有种花费同样代价的方式使得它们串成一个欧拉回路。所以直接添加就好。

那么我们差分处理一下就搞定了。

然后还有一种神奇的方法。

同样要加上MMM到000的路径。

首先将有用功加入答案中,然后的具体做法比较神奇:将起点和终点分别排序,下标相同的坐标相减取绝对值,加入答案中。

然后就没了。

这是什么神仙做法?

根据我的理解,这也是搞出欧拉回路,然后贪心地将起点和终点配对,即连在一起。

配对的时候排序,然后两两配,这样是最小的。我自己想了一个不完整的证明:假设有a1≤a2a_1\leq a_2a1​≤a2​和b1≤b2b_1\leq b_2b1​≤b2​,可以证明∣a1−b1∣+∣a2−b2∣≤∣a1−b2∣+∣a2−b1∣|a_1-b_1|+|a_2-b_2|\leq |a_1-b_2|+|a_2-b_1|∣a1​−b1​∣+∣a2​−b2​∣≤∣a1​−b2​∣+∣a2​−b1​∣。在数轴上分类讨论就可以证明了。

仔细想想,我发现这似乎已经无视了可以把乘客中途扔下车的操作(除了将几个欧拉回路连在一块之外)!

路径分成了很多段,如果拆开来这样做,就相当于可以中途将乘客赶下车,这样一定是没有问题的。这几段中,中间的每个交点既是起点,又是终点,它们自己和自己配对,不会优于与真正的起点终点配对。

这个东西感性理解一下吧……不会证明。


代码

using namespace std;
#include <cstdio>
#include <cstring>
#include <algorithm>
#define N 100010
int n,end;
struct Op{
int x,ty;
} o[N*2];
int m;
inline bool cmp(const Op &a,const Op &b){
return a.x<b.x;
}
long long ans;
int main(){
scanf("%d%d",&n,&end);
o[++m]={end,-1};
o[++m]={0,1};
for (int i=1;i<=n;++i){
int x,y;
scanf("%d%d",&x,&y);
ans+=abs(x-y);
o[++m]={x,-1};
o[++m]={y,1};
}
sort(o+1,o+m+1,cmp);
for (int i=2,j=o[1].ty;i<=m;++i){
ans+=1ll*(o[i].x-o[i-1].x)*abs(j);
j+=o[i].ty;
}
printf("%lld\n",ans);
return 0;
}

[JZOJ3187]【GDOI2013模拟8】的士的更多相关文章

  1. 【NOIP模拟】的士碰撞(二分答案)

    Description

  2. jzoj3156. 【GDOI2013模拟1】病毒传播

    题意: 村庄里有m个人,初始有一些人感染了病毒.如果第i个人的编号i满足,有一对(a,b)(a是初始病毒感染者编号,b为前一天的感染者编号)使\(a*b mod m =i\),则第i个人会感染病毒.每 ...

  3. 【GDOI2013模拟4】贴瓷砖

    题目 A镇的主街是由N个小写字母构成,镇长准备在上面贴瓷砖,瓷砖一共有M种,第i种上面有Li个小写字母,瓷砖不能旋转也不能被分割开来,瓷砖只能贴在跟它身上的字母完全一样的地方,允许瓷砖重叠,并且同一种 ...

  4. [JZOJ3168] 【GDOI2013模拟3】踢足球

    题目 描述 题目大意 有两个队伍,每个队伍各nnn人. 接到球的某个人会再下一刻随机地传给自己人.敌人和射门,射门有概率会中. 每次射门之后球权在对方111号选手. 某个队伍到了RRR分,或者总时间到 ...

  5. [JZOJ3167] 【GDOI2013模拟3】查税

    题目 描述 题目大意 维护一个有一次函数组成的序列 具体来说,对于位置xxx,现在的值为sx+zx∗(T−tx)s_x+z_x*(T-t_x)sx​+zx​∗(T−tx​) 有两个操作,修改某个位置上 ...

  6. [JZOJ3171] 【GDOI2013模拟4】重心

    题目 描述 题目大意 有一堆长为222的矩形,最下面的右端点横坐标为000. 每个矩形都有其固定的质量. 将这些矩形堆在一起,使得最右边的横坐标最大,并且满足它不会塌掉(满足物理学). 思考历程 首先 ...

  7. [JZOJ3177] 【GDOI2013模拟5】安全监控

    题目 描述 (样例都懒得发出来了) 题目大意 给你一个有向图,从111号点出发,绕一圈回来.这一圈中必须经过222号点. 问经过的最少的点数(不重复). 思考历程 一看就觉得是一道神题. 然后仔细观察 ...

  8. 不熟,不会,未a的题列表

    不熟: jzoj5968. 电竞选手(不知道公式如何得来) jzoj4877. [NOIP2016提高A组集训第10场11.8]力场护盾 (对向量不熟悉,不知道为什么结果要取反) jzoj4867. ...

  9. 编写Java程序,几个朋友到游乐场游玩,大家投票选择出行方式。使用程序来模拟这一结果。(工厂模式示例Demo)

    查看本章节 查看作业目录 需求说明: 几个朋友到游乐场游玩,大家投票选择出行方式.如果选择"A"最多的话,表示选择的交通工具是公交车(Bus):如果选择"B"最 ...

随机推荐

  1. 把Debian 设置中文环境

    要支持区域设置,首先要安装locales软件包: apt-get install locales 然后配置locales软件包: dpkg-reconfigure locales 在界面中钩选上“zh ...

  2. 拾遗:Unix 守护进程编写规范

    //标准库自带函数,通常以 daemon(0, 0) 方式调用 int daemon(int nochdir, int noclose) Linux: #include <unistd.h> ...

  3. 升级MySQL5.7.22版本_总结记录

    目录 一. mysql5.7安装 0. 背景 1. 准备:下载安装包 2. 安装流程小结 3. 具体步骤 二. mysql5.7的一些变化 一. mysql5.7安装 0. 背景 之前用的5.6版本, ...

  4. Markdown 语法大全

    1 强调 星号与下划线都可以,单是斜体,双是粗体,符号可跨行,符号可加空格 **一个人来到田纳西** __毫无疑问__ *我做的馅饼 是全天下* _最好吃的_ 效果: 一个人来到田纳西 毫无疑问 我做 ...

  5. Android笔记之RoundedImageView

    参考项目:GcsSloop/rclayout 实现1,利用Canvas.clipPath来实现,适用于任何View(无法去除锯齿效果) package com.bu_ish.blog; import ...

  6. WPF datagrid AutoGenerateColumns隐藏部分列

    原文:WPF datagrid AutoGenerateColumns隐藏部分列 <DataGrid x:Name="gridWC" ItemsSource="{B ...

  7. finalize的作用

    1. finalize的作用 finalize()是Object的protected方法,子类可以覆盖该方法以实现资源清理工作,GC在回收对象之前调用该方法. finalize()与C++中的析构函数 ...

  8. 【转】Java程序CPU飙升问题排查方法

    windows环境下cpu飙升问题 线上某台runtime机器(windows Server)cpu报警,这种情况初步就是代码里面死循环了,先把机器下线了保证不再有新的任务分配进来,然而cpu使用依然 ...

  9. DLL和OCX注册

    在注册DLL或者OCX的方法应该使用regsvr32.exe,使用得多了一定会觉得在cmd运行中写一长串东西很烦人吧!这里向大家介绍一种麻烦一次方便一生的方法.这个方法只要右击你想注册或者反注册的DL ...

  10. java异常继承何类,运行时异常与一般异常的区别

    一.基本概念 Throwable是所有异常的根,java.lang.ThrowableError是错误,java.lang.ErrorException是异常,java.lang.Exception ...