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. reuseaddr和点对点聊天

    解决绑定失败 在测试时,经常会出现绑定错误,bind error: Address already in use 这里只要指定一下socket的reuseaddr属性即可解决 int on=1; if ...

  2. Win7 VSCode 离线安装Rust语言及环境配置

    前置依赖 装过Visual Studio或Visual Studio Build Tool 2015 下载Rust离线安装包 https://forge.rust-lang.org/other-ins ...

  3. dubbo入门和springboot集成dubbo小例子

    从零开始搭建springboot-dubbo的例子 Dubbo 是一个分布式服务框架,致力于提供高性能和透明化的 RPC 远程服务调用方案,以及 SOA 服务治理方案 一. Dubbo的简单介绍 1. ...

  4. 【报错】Validation failed for object='userLogin'. Error count: 1

    提交表单之后: Whitelabel Error Page This application has no explicit mapping for /error, so you are seeing ...

  5. response.getWriter()和jsp中的out对象的区别

    (1) out和response.getWriter属于的类不同,前者是JspWriter,后者是java.io.PrintWriter.而JspWriter是一个抽象类, PrintWriter是一 ...

  6. flex布局相关用法

    /* pages/classic/classic.wxss */ .chunk { /* 行内元素可设置但是设置了flex,无效了 *//* display: inline-block; */ wid ...

  7. 浅谈Linux下的rpm

      虽然现在很多人都使用yum去替代rpm了,但是rpm在一些特殊场合下还是有其作用的,比如查询跟验证已安装的rpm包,rpm全称Redhat Package Manager,是一种用于互联网下载包的 ...

  8. C# 下载PDF文件(http与ftp)

    1.下载http模式的pdf文件(以ASP.NET为例,将PDF存在项目的目录下,可以通过http直接打开项目下的pdf文件) #region 调用本地文件使用返回pdfbyte数组 /// < ...

  9. mySql配置在nodejs中使用

    mySql安装完成后,配置链接nodejs项目中的数据库. 1.测试是否安装成功. 2.use nodejs使用nodejs 3.设置数据源 5.exit

  10. C# DataTable、实体相互转换

    public static T GetEntity<T>(DataTable table) where T : new() { T entity = new T(); foreach (D ...