Description

腐女要过生日了,pty 想给腐女送礼物,但是腐女所在的教室离pty 的教室太远了,于是pty就拜托会动归和A星的djy帮忙送礼物。djy在学校建立了一个平面直角坐标系,他站在了(0,0)点,腐女在(x0,y0)点,djy每次只能往上下左右四个方向移动一步,中间有n栋矩形教学楼,每个教学楼给出两个对角的坐标,并且保证每栋教学楼的周围区域(如图所示)不会有别的教学楼,即djy可以绕一个教学楼走不会碰到任何障碍,现在djy 想知道从起点到终点不碰到任何教学楼,最短需要多少步。

Input

第一行给出X0,y0;
第二行给出n;
下面一行每行x1,y1,x2,y2,表示一对对角的坐标;
保证每个矩形都不相交,且一个矩形的周围区域不会有别的矩形。

Output

输出只有一行:最短的步数

Sample Input

【样例输入1】
9 1
2
5 -3 8 3
10 -3 13 3
【样例输入2】
12 0
5
2 -1 3 1
6 -7 8 -1
6 1 8 6
4 3 4 5
10 -5 10 3

Sample Output

【样例输出1】
16
【样例输出2】
24

Data Constraint

保证所有的y坐标在[-10^6,10^6]
所有的x坐标在[0,10^6]
70%的数据保证:n<=1000
100%的数据保证:n<=10^5

分析

扫描线+线段树
我们把矩阵拆成两部分,左端点插入,右端点删除。插入的时候对应的y不能走,所以要赋成inf,删除的时候要重新计算答案。如果对应的y是[l,r],那我们只会由l-1,r-1两个位置的答案更新当前区间的答案。l-1对应的答案是tmp1,r+1对应的答案是tmp2,那他们两个点往中心更新答案是每移一格加1,那就是两个一次函数,斜率为正负1,可以很快地求出交点,知道哪一段的答案是由l-1更新更优,哪一段的答案是由r+1更新更优

代码

#include <bits/stdc++.h>#define N 200009
#define M 8000009
#define MAX 100001
#define INF 0x7fffffffstruct NOTE
{int lazy[2];
}t[M];struct NODE
{int x,l,r,op;
}num[N];void pushDown(int p)
{int tmp = (t[p].lazy[0] < t[p].lazy[1]) ? 1 : -1;t[p * 2].lazy[0] = t[p].lazy[0];t[p * 2].lazy[1] = (t[p].lazy[0] + t[p].lazy[1] + (tmp < 0)) / 2;t[p * 2 + 1].lazy[0] = (t[p].lazy[0] + t[p].lazy[1] + (tmp < 0)) / 2 + tmp;t[p * 2 + 1].lazy[1] = t[p].lazy[1];t[p].lazy[0] = t[p].lazy[1] = 0;
}void insert(int p,int l,int r,int x,int y,int xx,int yy)
{if (l == x && r == y){t[p].lazy[0] = xx;t[p].lazy[1] = yy;return;}int mid = (l + r) >> 1;if ((l != r) && (t[p].lazy[0] || t[p].lazy[1]))pushDown(p);if (y <= mid)insert(p * 2,l,mid,x,y,xx,yy);elseif (x > mid)insert(p * 2 + 1,mid + 1,r,x,y,xx,yy);else{insert(p * 2,l,mid,x,mid,xx,((yy > xx) ? 1 : -1) * (mid - x) + xx);insert(p * 2 + 1,mid + 1,r,mid + 1,y,((yy > xx) ? 1 : -1) * (mid - x + 1) + xx,yy);}
}int qury(int p,int l,int r,int v)
{int mid = (l + r) >> 1;if (l == r)return t[p].lazy[0];if (t[p].lazy[0] || t[p].lazy[1])pushDown(p);if (v <= mid)return qury(p * 2,l,mid,v);else return qury(p * 2 + 1,mid + 1,r,v);
}bool cmp(NODE x,NODE y)
{return (x.x < y.x) || (x.x == y.x) && (x.op > y.op);
}int cnt;void add(int x1,int y1,int x2,int y2)
{num[++cnt].x = x1;num[cnt].l = y1;num[cnt].r = y2;num[cnt].op = 1;num[+cnt].x = x2;num[cnt].l = y1;num[cnt].r = y2;num[cnt].op = -1;
}int main()
{freopen("bl.in","r",stdin);freopen("bl.out","w",stdout);int x0,y0;scanf("%d%d",&x0,&y0);int n;scanf("%d",&n);for (int i = 1; i <= n; i++){int x1,x2,y1,y2;scanf("%d%d%d%d",&x1,&y1,&x2,&y2);add(x1,y1,x2,y2);}std::sort(num + 1, num + cnt + 1, cmp);insert(1,-MAX,MAX,-MAX,0,MAX,0);insert(1,-MAX,MAX,1,MAX,1,MAX);for (int i = 1; i <= cnt; i++){if (num[i].x > x0)break;if (num[i].op == -1){int tmp1 = qury(1,-MAX,MAX,num[i].l - 1);int tmp2 = qury(1,-MAX,MAX,num[i].r + 1);int tmp = (num[i].l + num[i].r + tmp2 - tmp1) / 2;insert(1,-MAX,MAX,num[i].l - 1,tmp,tmp1,tmp1 + tmp - num[i].l + 1);if (tmp < num[i].r){insert(1,-MAX,MAX,tmp + 1,num[i].r + 1,tmp2 + num[i].r - tmp,tmp2);}}}printf("%d\n",qury(1,-MAX,MAX,y0) + x0);
}

BZOJ 5049. 【GDOI2017模拟一试4.11】腐女的生日相关推荐

  1. JZOJ 5050. 【GDOI2017模拟一试4.11】颜色树

    Description 思源湖畔有一棵树,那是独孤玉溪最喜欢的地方. 传说中,这棵不见边际的树有N个节点,每个节点都有1片叶子,每片叶子都拥有K种颜色中的一种,独孤玉溪喜欢爬到这棵树上,沿着一条路线摘 ...

  2. JZOJ 5048. 【GDOI2017模拟一试4.11】IQ测试

    Description PTY进行IQ测试,测试的项目是判断一个序列是否是另外一个序列删除若干个数字之后得 到的,PTY 深知自己的IQ 低于sqrt(-1),所以他请来了智商超高的你来替他解决问题. ...

  3. 【jzoj5055】【GDOI2017模拟二试4.12】【树上路径】【点分治】

    题目大意 给定一颗n个结点的无根树,树上的每个点有一个非负整数点权,定义一条路径的价值为路径上的点权和-路径的点权最大值. 给定参数p,我们想知道,有多少不同的树上简单路径,满足它的价值恰好是p的倍数 ...

  4. 《金蝶ERP—K/3标准财务模拟实训(11.X版)》——第1章 金蝶K/3标准财务介绍 1.1 金蝶K/3标准财务系统介绍...

    本节书摘来自异步社区<金蝶ERP-K/3标准财务模拟实训(11.X版)>一书中的第1章,第1.1节,作者 龚中华,何亮,更多章节内容可以访问云栖社区"异步社区"公众号查 ...

  5. 梦幻模拟战手游服务器维护,梦幻模拟战手游11月21日更新公告 执行者降临限时召唤开启[多图]...

    梦幻模拟战手游11月21日更新内容中开启了限时十连抽必得SR英雄哦,同时还有时空的轨迹SC秘境新挑战,接下来跟随安族大大来看看详细资讯详情吧,希望各位能够喜欢~ 梦幻模拟战手游11月21日更新公告 服 ...

  6. 今天收到模拟飞行平台X-Plane 11官方邮件

    今天收到模拟飞行平台X-Plane 11官方邮件.主要是X-Plane 11.50版本正在经历一个长长的公测阶段,今天的版本是X-Plane 11.50b14,他们把API变成了thread unsa ...

  7. 【GDOI2017模拟11.7】太阳神

    题目描述 太阳神拉很喜欢最小公倍数,有一天他想到了一个关于最小公倍数的题目. 求满足如下条件的数对(a,b)对数:a,b均为正整数且a,b<=n而lcm(a,b)>n.其中的lcm当然表示 ...

  8. jzoj4684. 【GDOI2017模拟8.11】卡牌游戏

    原来想这道题时田忌赛马问题...从贪心想...一直没想出来...naive 事实上,这道题其实就是田忌赛马问题,但是有添加操作,所以单纯排序不行了 注意到d同学的贪心策略也可以表示为如下:(默认规则为 ...

  9. 【GDOI2017模拟11.3】永恒的契约

    Description 宅邸迅速的燃烧着,必须带贝蒂走出禁书库!凭着感觉,又一次直接找到禁书库的门. "你,是那个人嘛?"400年了,当初圣域建立结界时没有进入圣域,被伤了心的人工 ...

最新文章

  1. 负载均衡,会话保持,session同步
  2. 【Spark Summit East 2017】Spark化数据引擎
  3. 驱动人生(离线网卡版)_驱动人生8.0版正式发布,最新功能速看
  4. 为什么谐振时电抗为0_220KV/110KVCVT互感器串联谐振试验装置技术方案
  5. JavaScript学习笔记——BOM_window对象
  6. [python应用案例] 一.BeautifulSoup爬取天气信息并发送至QQ邮箱
  7. 我和面试官之间关于操作系统的一场对弈 | 原力计划
  8. mysql,php和js根据经纬度计算距离
  9. 线性可分支持向量机与硬间隔最大化
  10. 利用 IntelliJ IDEA 进行代码对比的方法
  11. 中国成网络攻击最大受害国之一
  12. Centos8安装Tomcat8.5.55
  13. 计算机和人脑在线阅读,人脑与电脑
  14. 计算机 修改 虚拟ip,怎么样在电脑中设置虚拟IP地址?
  15. Android代码设置APN
  16. Nginx代理无法访问Nexus问题
  17. 《Linux操作系统 - RK3288开发笔记》第2章 G-3288-02开发环境搭建
  18. 云计算技术基础【2】
  19. pp棉滤芯保安过滤器
  20. Xshell终端工具,使用backspace删除键终端显示为^H的解决方法

热门文章

  1. 微信无法下载文件做提示跳转到浏览器
  2. Adobe Photoshop CC for Mac 2019 中文免费版软件在线安装教程
  3. 身为程序员,你焦虑吗?
  4. 计算机开机执行的第一条指令是什么?
  5. [HTML]关于html禁止图片拖动,以及禁止拖动图片时打开新的标签页
  6. ISO认证怎么办理,申请流程
  7. 学习笔记 | 数据分析之AB Test
  8. DP83848CVV整张原理图
  9. 如何理解假设检验中的alpha值和p值
  10. python打开文件时,找不到文件 FileNotFoundError: [Errno 2] No such file or directory报错