分析

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

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

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. MySQL Boolean类型的坑

    MySQL中,Boolean只是 tinyint(1) 的别名,也就是说,MySQL中并没有真正的bool类型. 而SQLAlchemy生成SQL的时候并没有检测到 这一点,这就导致一个问题,当使用 ...

  2. sort.interface接口

    一个内置的排序算法需要知道三个东西:序列的长度,表示两个元素比较的结果,一种交换两个元素的方式:这就是sort.Interface的三个方法: package sort type Interface ...

  3. Vue 上传前获取图片宽度尺寸和大小

    参考资料:https://www.cnblogs.com/wyx-remove-love/p/wyx-20190626-1.html    https://blog.csdn.net/qq_22771 ...

  4. 第一百零四篇:DOM事件流

    好家伙,JS基础接着学,   1.事件流 页面哪个部分拥有特定的事件? 可以把页面想象成一个同心圆, 当你戳了其中的一点,其实你同时戳中了很多个圆   当你点击一个页面中的按钮,实际上你同时点击了这个 ...

  5. 【Azure Notification Hub】如何手动删除 Notification Hub 中已注册的设备

    问题描述 在Notification Hub中注册了设备后,从Azure门户上没有找到相应的入口来删除已注册设备 (Active Devices) 如果使用C# SDK是否有办法删除呢? 问题解答 可 ...

  6. C++ STL函数对象 仿函数

    1 //STL函数对象 仿函数 2 #include<iostream> 3 #include<string> 4 5 using namespace std; 6 7 8 / ...

  7. Codeforces Round 638 (Div. 2)B. Phoenix and Beauty

    B. Phoenix and Beauty 这道题目学到的东西: 从给出的数据范围观察,得到一些有用信息(峰哥教的) 考虑无解的情况' 其实这题考虑怎么操作是比较难的,如果能想出来满足条件的结果就比较 ...

  8. aardio 背景透明的3种方式(透明窗体1 webview2,透明窗体2-win-region-bitmap,透明窗体3-winform-transparent-color)

    aardio 背景透明的3种方式(透明窗体1 webview2,透明窗体2-win-region-bitmap,透明窗体3-winform-transparent-color) 3种透明窗体,主要分成 ...

  9. Grails的数据库相关开发

    1.开发domain和service 在出来的输入框里输入domain的名字,可以包括包名. 这里我输入test.domain.House,点finish 创建了两个groovy文件,一个当然是tes ...

  10. 使用ConnectivityManager.bindProcessToNetwork绑定特殊网络

    最近测试那边提了一个bug,经过排查后发现其原因:是因为连接的Wi-Fi无法上网,因此在Android系统的多网络策略中,可以上网的SIM移动网络被设置为系统默认网络,投屏组件docker传输与反控模 ...