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. WEB安全----XSS和CSRF

    随着Web2.0.社交网络.微博等等一系列新型的互联网产品的诞生,基于Web环境的互联网应用越来越广泛,企业信息化的过程中各种应用都架设在Web平台上,Web业务的迅速发展也引起黑客们的强烈关注,接踵 ...

  2. 浮点数float累加误差解决方式总结

    首先是float累加产生误差的原因,该部分转自:http://blog.csdn.net/zhrh0096/article/details/38589067 1.  浮点数IEEE 754表示方法 要 ...

  3. mybatis批量插入、更新和删除

    https://blog.csdn.net/m0_37981235/article/details/79131493 https://www.jb51.net/article/132823.htm

  4. C#将字符串Split()成数组

    string str="aaajbbbjccc";string[] sArray=str.Split('j');foreach(string i in sArray) Respon ...

  5. JSP基础--会话跟踪技术、cookie、session

    会话跟踪技术 1 什么是会话跟踪技术 我们需要先了解一下什么是会话!可以把会话理解为客户端与服务器之间的一次会晤,在一次会晤中可能会包含多次请求和响应.例如你给10086打个电话,你就是客户端,而10 ...

  6. Node.js实战2:模块使用入门。

    NodeJS有丰富的三方模块,借助这些模块,可以快速的开发各类应用.这使用Nodejs可以进行很便捷.快速的开发. 1.安装与加载模块内核.三方 使用npm可以搜索.安装.卸载模块. 例: 搜索模块 ...

  7. vue手写轮播

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  8. 利用Spring实现Hello World

    因为最近要做Java Web方面的开发,所以,就像使用Spring来实现一个以前学其他程序时首先做的一个示例"Hello World!"练练手,之前用很多中语言实现过hello w ...

  9. Node总结

    一. 基本概念 1.1 DOM DOM(Document Object Model), 把网页转换成JS对象,可以用脚本进行各种操作.浏览器将结构化文档(HTML/XML)解析成一系列的节点形成DOM ...

  10. Android -ui控件

    一:TextView控件 TextView --> View 1.创建TextView的两种方式: 1.1编写TextView类 TextView tv = new TextView(this) ...