speike

题目描述

众所周知,Speike 狗是一条特别喜欢追着Tom 打的狗。

现在,Tom 又把Speike 惹生气了,现在Speike 需要跨越千山万水找Tom 报仇。

Speike 所在的世界可以看成是一个无穷大的平面,平面由一个平面直角坐标系确定。在平面上有许多不相交的矩形障碍,矩形的四边平行于坐标轴。

Speike 需要从 (0,0)(0,0) 出发,在尽量短的时间内跑到 (X_t,0)(Xt​,0),也就是Tom 在的位置。

出题人规定,Speike 只能沿着平行于坐标轴的方向运动,且不能进入矩形障碍的内部,但是可以在障碍边界上移动。

所有障碍的横坐标都在 [0,X_t][0,Xt​] 之内。保证矩形不相交(即没有公共面积),也不会退化成线段或者点。

Speike 的智商不是很高,因此他需要你帮忙设计一条最短的路线。当然,你只需要告诉他路线的长度就行了。

输入格式

第一行一个整数 nn,代表障碍的个数。

第二行一个整数 X_tXt​,代表终点的横坐标。

第三行开始,共 nn 行,每行4 个整数 a,b,c,da,b,c,d,代表每个矩形的某两个相对的顶点的坐标为 (a,b)(a,b) 和 (c,d)(c,d)

输出格式

共一行,一个整数,代表最短路线的长度。

样例

共下发三个样例,分别与第2; 4; 11 号测试点的数据范围与特性一致。

数据范围与提示

测试点编号 n的范围 特殊性质
1 n \le 0n≤0
2,3 n \le 1n≤1
4,5,6 n \le 20n≤20 a, b, c, d, X_{t} \in\left[-10^{3}, 10^{3}\right]a,b,c,d,Xt​∈[−103,103]
7,8,9,10 n \le 200n≤200 a, b, c, d, X_{t} \in\left[-10^{5}, 10^{5}\right]a,b,c,d,Xt​∈[−105,105]
11,12,13 n \le 2000n≤2000 a, b, c, d, X_{t} \in\left[-10^{3}, 10^{3}\right]a,b,c,d,Xt​∈[−103,103]
14,15 n \le 2000n≤2000
16,17 n \le 10^5n≤105 所有矩形都与xx轴相交
18,19,20 n \le 5 \times 10^5n≤5×105 nn有一定梯度

-10^{8} \leq a, c \leq X_{t} \leq 10^{8},-10^{8} \leq b, d \leq 10^{8}, n \in\left[0,10^{5}\right]−108≤a,c≤Xt​≤108,−108≤b,d≤108,n∈[0,105]。
保证矩形不相交(即没有公共面积),每个矩形不会退化成线段或者点,且横坐标都在 [0,X_t][0,Xt​] 之内。

来源

CSP-S 2019模拟 长沙一中2


Solution
我就把题解的话复读一边:
考虑一条路线,x一定是单调增的。
而且该路线一定贴着矩形的边。
那么我们可以把矩形按左边的线排序,对于每一个矩形考虑他的左边两个端点,找到最近一个可以转移的矩形转移就行。
找矩形可以线段树或者set
#include<cstdio>
#include<iostream>
#include<cstdlib>
#include<cstring>
#include<algorithm>
#include<cmath>
#define maxn 1000006
#define lb(x) lower_bound(Y+1,Y+m+1,x)-Y
#define mid ((l+r)>>1)
#define ls k<<1
#define rs k<<1|1
using namespace std;
int n,ed,Y[maxn],f[maxn][],t;
int tr[maxn*];
struct node{
int a,b,c,d;
}s[maxn];
bool cmp(node A,node B){
return A.a<B.a;
}
void add(int k,int l,int r,int li,int ri,int v){
if(l>=li&&r<=ri){tr[k]=v;return;}
if(li<=mid)add(ls,l,mid,li,ri,v);
if(ri>mid)add(rs,mid+,r,li,ri,v);
}
void ask(int k,int l,int r,int pl){
t=max(t,tr[k]);
if(l==r)return;
if(pl<=mid)return ask(ls,l,mid,pl);
return ask(rs,mid+,r,pl);
}
int main(){
cin>>n>>ed;
for(int i=;i<=n;i++){
scanf("%d%d%d%d",&s[i].a,&s[i].b,&s[i].c,&s[i].d);
if(s[i].a>s[i].c)swap(s[i].a,s[i].c);
if(s[i].b>s[i].d)swap(s[i].b,s[i].d);
Y[i]=s[i].d,Y[i+n]=s[i].b;
} int N=n+n+;Y[N]=;
sort(Y+,Y+N+);int m=unique(Y+,Y+N+)-Y-;
s[++n]=(node){ed,,ed,};
sort(s+,s+n+,cmp);
for(int i=;i<=n;i++){
t=;ask(,,m,lb(s[i].b));
f[i][]=min(f[t][]+abs(s[t].b-s[i].b),f[t][]+abs(s[t].d-s[i].b));
t=;ask(,,m,lb(s[i].d));
f[i][]=min(f[t][]+abs(s[t].b-s[i].d),f[t][]+abs(s[t].d-s[i].d));
add(,,m,lb(s[i].b),lb(s[i].d),i);
}
cout<<f[n][]+ed<<endl;
return ;
}
 

speike的更多相关文章

  1. Vue 项目架构设计与工程化实践

    来源 文中会讲述我从0~1搭建一个前后端分离的vue项目详细过程 Feature: 一套很实用的架构设计 通过 cli 工具生成新项目 通过 cli 工具初始化配置文件 编译源码与自动上传CDN Mo ...

随机推荐

  1. 怎样用idhttpserver代替IIS让用户浏览html或下载文件 http://bbs.csdn.net/topics/360248674

      怎样用idhttpserver代替IIS让用户浏览html或下载文件 更多0分享到: 相关知识库: C# 虚拟现实(VR) Node.js 算法与数据结构     对我有用[0] 丢个板砖[0]  ...

  2. php 的定界符 <<<eof 的问题

    PHP是一个Web编程语言,在编程过程中难免会遇到用echo来输出大段的html和javascript脚本的情况,如果用传统的输出方法 ——按字符串输出的话,肯定要有大量的转义符来对字符串中的引号等特 ...

  3. PHP点滴记录

    mysqli_fetch_object() //取得当前行,并作为对象返回 mysqli_fetch_row() //从结果集中取得一行,并作为枚举数组返回 mysqli_fetch_array() ...

  4. VS2012生成Web时报未能找到元数据文件xxx.dll

    问题:引用里已经添加了,还是报‘未能找到元数据文件xxx.dll’ 解决:添加了相同的不同路径的xxx.dll文件,删掉一个用不到的,就不报错了

  5. for in 和for of的区别

    for in 和for of的区别:https://www.jianshu.com/p/c43f418d6bf0 1 遍历数组通常用for循环 ES5的话也可以使用forEach,ES5具有遍历数组功 ...

  6. metasploit下Windows的多种提权方法

    metasploit下Windows的多种提权方法 前言 当你在爱害者的机器上执行一些操作时,发现有一些操作被拒绝执行,为了获得受害机器的完全权限,你需要绕过限制,获取本来没有的一些权限,这些权限可以 ...

  7. 微软Visual Studio Code基本特征

    Visual Studio Code它的核心功能还是作为一个代码编辑器.和其他的代码编辑器一样,VScode采取通用的UI和布局,浏览器在左边,显示所有的文件和文件夹,右边你打开的文件的编辑页面. 文 ...

  8. js中的对象类型的基本操作

    示例 /** * 对象属于一种复合数据类型,在对象中可以保存多个不同数据类型的属性 * 对象的分类: * 1.内建对象 * - 由ES标准定义的对象,在任何ES的实现中都可以使用,比如:Math, * ...

  9. 2018-8-10-win10-UWP-发邮件

    title author date CreateTime categories win10 UWP 发邮件 lindexi 2018-08-10 19:17:19 +0800 2018-2-13 17 ...

  10. 初学Java 数值运算符

    import java.util.Scanner; public class DisplayTime { public static void main(String[] args) { Scanne ...