分析

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

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

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


代码

  1. #include <cstdio>
  2. #include <cctype>
  3. #include <algorithm>
  4. #define rr register
  5. using namespace std;
  6. const int N=500011;
  7. typedef long long lll; lll dp[N][2];
  8. struct duan{int x,l,r;}line[N];
  9. int w[N<<2],xt,q,b[N<<1],bas,n,m;
  10. inline signed iut(){
  11. rr int ans=0,f=1; rr char c=getchar();
  12. while (!isdigit(c)) f=(c=='-')?-f:f,c=getchar();
  13. while (isdigit(c)) ans=(ans<<3)+(ans<<1)+(c^48),c=getchar();
  14. return ans*f;
  15. }
  16. bool cmp(duan x,duan y){return x.x<y.x;}
  17. inline signed max(int a,int b){return a>b?a:b;}
  18. inline lll min(lll a,lll b){return a<b?a:b;}
  19. inline signed aabs(int x){return x<0?-x:x;}
  20. inline signed query(int x){
  21. rr int ans=1;
  22. for (x+=bas;x;x>>=1)
  23. ans=max(ans,w[x]);
  24. return ans;
  25. }
  26. inline void update(int l,int r,int z){
  27. for(l+=bas-1,r+=bas+1;l^r^1;l>>=1,r>>=1){
  28. if (!(l&1)) w[l^1]=max(w[l^1],z);
  29. if (r&1) w[r^1]=max(w[r^1],z);
  30. }
  31. }
  32. signed main(){
  33. freopen("speike.in","r",stdin);
  34. freopen("speike.out","w",stdout);
  35. n=iut(),m=1,line[1]=(duan){0,0,0},
  36. line[2]=(duan){xt=iut(),0,0},q=2;
  37. for (rr int i=1;i<=n;++i){
  38. rr int lx=iut(),ly=iut(),rx=iut(),ry=iut();
  39. if (lx>rx) swap(lx,rx); if (ly>ry) swap(ly,ry);
  40. line[++q]=(duan){lx,ly,ry},b[++m]=ly,b[++m]=ry;
  41. }
  42. sort(b+1,b+1+m),m=unique(b+1,b+1+m)-b-1;
  43. sort(line+2,line+1+q,cmp);
  44. for (bas=1;(bas<<=1)<m+3;);
  45. for (rr int i=1;i<=q;++i)
  46. line[i].l=lower_bound(b+1,b+1+m,line[i].l)-b,
  47. line[i].r=lower_bound(b+1,b+1+m,line[i].r)-b;
  48. for (rr int i=2;i<=q;++i){
  49. rr int t1=query(line[i].l),t2=query(line[i].r);
  50. 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])),
  51. 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])),
  52. update(line[i].l,line[i].r,i);
  53. }
  54. return !printf("%lld",min(dp[q][0],dp[q][1])+xt);
  55. }

#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. Windows系统下的输入法选择

    总共用过5款输入法:搜狗拼音输入法,QQ拼音输入法,谷歌拼音输入法,手心输入法,小狼毫. 搜狗输入法功能最强大,词库也很全,基本上对于盲打的输入纠错很准确,但是因为后台会启动多个服务,会占很多内存资源 ...

  2. mac上安装vue

    安装node.js brew install nodejs node -v #查看版本 给nodejs模块安装目录设置访问权限 sudo chmod -R 777 /usr/local/lib/nod ...

  3. 深入解析Python并发编程的多线程和异步编程

    本文分享自华为云社区<Python并发编程探秘:多线程与异步编程的深入解析>,作者:柠檬味拥抱. 在Python编程中,多线程是一种常用的并发编程方式,它可以有效地提高程序的执行效率,特别 ...

  4. sqlserver数据库jar包下载

    链接:https://pan.baidu.com/s/1mCx5JpVpmU6uUaqMITxP_Q提取码:4piq 说明:若链接失效,联系会及时补上!

  5. 在Windows环境中配置使用我们搭建的DNS服务器

    1.修改网卡的设置,首选DNS用我们自己的 2.在命令行中测试 专业的nslookup 3.已知的问题 每次在DNS服务器的web界面中,修改了解析,必须用docker restart dns命令,把 ...

  6. 用几张图实战讲解MySQL主从复制

    本文分享自华为云社区<结合实战,我为MySQL主从复制总结了几张图!>,作者: 冰 河. MySQL官方文档 MySQL 主从复制官方文档链接地址如下所示: http://dev.mysq ...

  7. Springboot中-全局异常处理类用法示例

    使用springboot搭建web项目的时候,一般都会添加一个全局异常类,用来统一处理各种自定义异常信息, 和其他非自定义的异常信息,以便于统一返回错误信息.下面就是简单的示例代码, 自定义异常信息. ...

  8. 3DCAD图纸转2D(DXF)图纸通用解决方案文稿

    本文地址:https://gitee.com/dvaloveu/lovedva/issues/I6B5YC 视频演示(1.25倍速&原速):Acfun Bilibili 脚本地址:https: ...

  9. Nginx安装nginx-rtmp-module模块

    简介 nginx中的模块虽然就是类似插件的概念,但是它无法像VsCode那样轻松的安装扩展. nginx要安装其它模块必须同时拿到nginx源代码和模块源代码,然后手动编译,将模块打到nginx中,最 ...

  10. 微型MPU6050模块及串口/BLE透传的实物展示

    前言   随着时间的积累,项目的沉淀.把很多做过的产品标准化掉,形成可以立即拿出来使用的产品.是非常重要的一个环节.最近,把基于MPU6050的模块微型化并使用串口透传这个产品梳理了一下.形成了标准化 ...