分析

由于可以走边界,那么最短路径一定按横坐标递增并且经过矩形的顶点,

考虑扫描线,找到当前线段(矩形右边界可以忽略)两个端点离的最近而又可达的线段,

dp一下并用线段树维护就可以了


代码

#include <cstdio>
#include <cctype>
#include <algorithm>
#define rr register
using namespace std;
const int N=500011;
typedef long long lll; lll dp[N][2];
struct duan{int x,l,r;}line[N];
int w[N<<2],xt,q,b[N<<1],bas,n,m;
inline signed iut(){
rr int ans=0,f=1; rr char c=getchar();
while (!isdigit(c)) f=(c=='-')?-f:f,c=getchar();
while (isdigit(c)) ans=(ans<<3)+(ans<<1)+(c^48),c=getchar();
return ans*f;
}
bool cmp(duan x,duan y){return x.x<y.x;}
inline signed max(int a,int b){return a>b?a:b;}
inline lll min(lll a,lll b){return a<b?a:b;}
inline signed aabs(int x){return x<0?-x:x;}
inline signed query(int x){
rr int ans=1;
for (x+=bas;x;x>>=1)
ans=max(ans,w[x]);
return ans;
}
inline void update(int l,int r,int z){
for(l+=bas-1,r+=bas+1;l^r^1;l>>=1,r>>=1){
if (!(l&1)) w[l^1]=max(w[l^1],z);
if (r&1) w[r^1]=max(w[r^1],z);
}
}
signed main(){
freopen("speike.in","r",stdin);
freopen("speike.out","w",stdout);
n=iut(),m=1,line[1]=(duan){0,0,0},
line[2]=(duan){xt=iut(),0,0},q=2;
for (rr int i=1;i<=n;++i){
rr int lx=iut(),ly=iut(),rx=iut(),ry=iut();
if (lx>rx) swap(lx,rx); if (ly>ry) swap(ly,ry);
line[++q]=(duan){lx,ly,ry},b[++m]=ly,b[++m]=ry;
}
sort(b+1,b+1+m),m=unique(b+1,b+1+m)-b-1;
sort(line+2,line+1+q,cmp);
for (bas=1;(bas<<=1)<m+3;);
for (rr int i=1;i<=q;++i)
line[i].l=lower_bound(b+1,b+1+m,line[i].l)-b,
line[i].r=lower_bound(b+1,b+1+m,line[i].r)-b;
for (rr int i=2;i<=q;++i){
rr int t1=query(line[i].l),t2=query(line[i].r);
dp[i][0]=min(dp[t1][0]+aabs(b[line[i].l]-b[line[t1].l]),dp[t1][1]+aabs(b[line[i].l]-b[line[t1].r])),
dp[i][1]=min(dp[t2][0]+aabs(b[line[i].r]-b[line[t2].l]),dp[t2][1]+aabs(b[line[i].r]-b[line[t2].r])),
update(line[i].l,line[i].r,i);
}
return !printf("%lld",min(dp[q][0],dp[q][1])+xt);
}

#zkw线段树,扫描线,dp,离散#NOIP2020.9.26模拟speike的更多相关文章

  1. HDU 4366 Successor(树链剖分+zkw线段树+扫描线)

    [题目链接] http://acm.hdu.edu.cn/showproblem.php?pid=4366 [题目大意] 有一个公司,每个员工都有一个上司,所有的人呈树状关系,现在给出每个人的忠诚值和 ...

  2. 线段树(单标记+离散化+扫描线+双标记)+zkw线段树+权值线段树+主席树及一些例题

    “队列进出图上的方向 线段树区间修改求出总量 可持久留下的迹象 我们 俯身欣赏” ----<膜你抄>     线段树很早就会写了,但一直没有总结,所以偶尔重写又会懵逼,所以还是要总结一下. ...

  3. 【Codeforces720D】Slalom 线段树 + 扫描线 (优化DP)

    D. Slalom time limit per test:2 seconds memory limit per test:256 megabytes input:standard input out ...

  4. BZOJ 4422 Cow Confinement (线段树、DP、扫描线、差分)

    题目链接: https://www.lydsy.com/JudgeOnline/problem.php?id=4422 我真服了..这题我能调一天半,最后还是对拍拍出来的...脑子还是有病啊 题解: ...

  5. POJ 1769 Minimizing maximizer(DP+zkw线段树)

    [题目链接] http://poj.org/problem?id=1769 [题目大意] 给出一些排序器,能够将区间li到ri进行排序,排序器按一定顺序摆放 问在排序器顺序不变的情况下,一定能够将最大 ...

  6. zkw线段树详解

    转载自:http://blog.csdn.net/qq_18455665/article/details/50989113 前言 首先说说出处: 清华大学 张昆玮(zkw) - ppt <统计的 ...

  7. BZOJ-3225 立方体覆盖 线段树+扫描线+乱搞

    看数据范围像是个暴力,而且理论复杂度似乎可行,然后被卡了两个点...然后来了个乱搞的线段树+扫描线.. 3225: [Sdoi2008]立方体覆盖 Time Limit: 2 Sec Memory L ...

  8. hdu 4052 线段树扫描线、奇特处理

    Adding New Machine Time Limit: 10000/5000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Othe ...

  9. ZKW线段树入门

    Part 1 来说说它的构造 线段树的堆式储存 我们来转成二进制看看 小学生问题:找规律 规律是很显然的 一个节点的父节点是这个数左移1,这个位运算就是低位舍弃,所有数字左移一位 一个节点的子节点是这 ...

  10. V-Parenthesis 前缀+ZKW线段树或RMQ

    Bobo has a balanced parenthesis sequence P=p 1 p 2…p n of length n and q questions. The i-th questio ...

随机推荐

  1. Django之第三方平台QQ授权登录的实现

    接入指南:https://wiki.connect.qq.com/成为开发者 准备工作 成为开发者 首先要有一个开发者账号,https://connect.qq.com/ 登录后点击用户头像,修改个人 ...

  2. Google Chrome 开启多下载下载,提高文件下载速度

    在地址栏输入: chrome://flags/#enable-parallel-downloading Parallel downloading改为Enabled后重启浏览器即可打开多线程下载 (多线 ...

  3. 第125篇: 期约Promise基本特性

    好家伙,本篇为<JS高级程序设计>第十章"期约与异步函数"学习笔记 1.非重入期约 1.1.可重入代码(百度百科) 先来了解一个概念 可重入代码(Reentry cod ...

  4. 服务网关ZUUL过滤器

    过滤器两个功能: 1.其中路由功能负责将外部请求转发到具体的微服务实例上,是实现外部访问统一入口的基础: 2.过滤器功能则负责对请求的处理过程进行预干预,是实现请求校验.服务聚合等功能的基础. 有4类 ...

  5. 用图机器学习探索 A 股个股相关性变化

    在本系列的前文 [1,2]中,我们介绍了如何使用 Python 语言图分析库 NetworkX [3] + Nebula Graph [4] 来进行<权力的游戏>中人物关系图谱分析. 在本 ...

  6. UG474

    为了对工程的资源利用率进行优化,我们首先需要知道当前工程对资源的利用率情况.在Vivado下,我们可以查看工程的资源利用率情况,在下面这张图中,其罗列出了整个工程所使用的资源情况.首先,下面我们需要一 ...

  7. Atom安装插件的几种方式

    界面安装 打开Atom->File->Settings->Install 输入你想要安装的插件名/Theme名 命令行安装 打开cmd命令行程序 切换到.atom/package目录 ...

  8. sourceTree Mac 跳过注册 安装

    打开sourcetree 关闭sourcetree 命令终端输入defaults write com.torusknot.SourceTreeNotMAS completedWelcomeWizard ...

  9. Java中float和double的精度

    比较基本类型double和float和某一个数是否相等的时候,不要用==或>=或<=,因为double和float都是有精度问题的,计算机只能保存一定位数的小数,这就会存在精度问题. 下面 ...

  10. Java8的核心功能就是Lambda和Streaming API

    Java8的核心功能就是Lambda和Streaming API