【题目链接】 http://acm.hdu.edu.cn/showproblem.php?pid=5820

【题目大意】

  在一个大小为50000*50000的矩形中,有n个路灯。

  询问是否每一对路灯之间存在一条道路,使得长度为|x1–x2|+|y1–y2|且每个拐弯点都是路灯。

【题解】

  只要找到不共线的两个点,他们所构成的矩阵剩余的两个点都是不存在的,那么这个图就是违法的。那么如何找呢,我们将所有点按照x为第一关键字,y为第二关键字排序,逐行扫描,对于每个点,扫描与他同行的前后两个点的列坐标形成的区间,如果这个区间出现x坐标比这个点所在列上一个出现的点要大,那么就是非法的。所以剩下的就是线扫描和rmq问题了。

【代码】

#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
const int U=50000,N=500005;
int L,R,n,T[U<<2],v[N],x,y,M,ans;
struct data{int x,y;}p[N];
bool cmp(data a,data b){return a.x==b.x?a.y<b.y:a.x<b.x;}
bool check(){memset(T,0,sizeof(T)); for(L=0,R=-1;L<n;L=R+1){while(R+1<n&&p[R+1].x==p[L].x)R++;for(int i=L;i<=R;i++){if(i>L&&p[i].y==p[i-1].y)continue;x=i==L?1:p[i-1].y+1;y=i==R?U:p[i+1].y-1;for(x=x+M-1,y=y+M+1,ans=0;x^y^1>0;x>>=1,y>>=1){if(~x&1)ans=max(ans,T[x+1]);if(y&1)ans=max(ans,T[y-1]);}if(ans>T[p[i].y+M])return 0;}for(int i=L;i<=R;i++){T[p[i].y+M]=p[i].x;for(int b=(p[i].y+M)/2;b;b/=2)T[b]=max(T[b<<1],T[(b<<1)^1]);}}return 1;
}
int main(){for(M=1;M<U+2;M<<=1);while(~scanf("%d",&n),n){for(int i=0;i<n;i++)scanf("%d%d",&p[i].x,&p[i].y);sort(p,p+n,cmp);if(check())puts("YES");else puts("NO");}return 0;
}

转载于:https://www.cnblogs.com/forever97/p/hdu5820.html

HDU 5820 Lights(扫描线+zkw线段树)相关推荐

  1. Atlantis HDU - 1542 (扫描线,线段树)

    扫描线的模板题,先把信息接收,然后排序,记录下上边和下边,然后用一条虚拟的线从下往上扫.如果我扫到的是下边,那么久用线段树在这个区间内加上1,表示这个区间现在是有的,等我扫描到上边的时候在加上-1,把 ...

  2. BZOJ3196 二逼平衡树 ZKW线段树套vector(滑稽)

    我实在是不想再打一遍树状数组套替罪羊树了... 然后在普通平衡树瞎逛的时候找到了以前看过vector题解 于是我想:为啥不把平衡树换成vector呢??? 然后我又去学了一下ZKW线段树 就用ZKW线 ...

  3. 线段树和zkw线段树

    作者作为一个蒟蒻,也是最近才自学了线段树,不对的地方欢迎大佬们评论,但是不要喷谢谢 好啦,我们就开始说说线段树吧 线段树是个支持区间操作和查询的东东,平时的话还是蛮实用的 下面以最基本的区间加以及查询 ...

  4. 线段树简单入门 (含普通线段树, zkw线段树, 主席树)

    线段树简单入门 递归版线段树 线段树的定义 线段树, 顾名思义, 就是每个节点表示一个区间. 线段树通常维护一些区间的值, 例如区间和. 比如, 上图 \([2, 5]\) 区间的和, 为以下区间的和 ...

  5. HDU 1166 敌兵布阵(线段树:点更新,区间求和)

    HDU 1166 敌兵布阵(线段树:点更新,区间求和) http://acm.hdu.edu.cn/showproblem.php?pid=1166 题意: 给你n个整数,然后给你多条命令,每条命令如 ...

  6. 850. 矩形面积 II:扫描线+离散化+线段树

    Difficulty: hard 标签: 扫描线, 离散化, 线段树 题目链接 力扣 题目解析 面试代码 /** x轴方向使用扫描线,y轴方向使用线段树维护扫描线的长度和每个区间覆盖的次数.由于y轴方 ...

  7. HDU 3016 Man Down (线段树+dp)

    HDU 3016 Man Down (线段树+dp) Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Ja ...

  8. 2019CCPC网络赛 1002 HDU 6703(权值线段树)

    2019CCPC网络赛 1002 HDU 6703(权值线段树) 思路:用权值线段树存题目给的数据后,2操作就是求权值线段树中大于等于k的部分中,靠近左端点的第一个大于r的值(这个求出来的只是原序列中 ...

  9. HDU 1264 Counting Squares (线段树-扫描线-矩形面积并)

    版权声明:欢迎关注我的博客.本文为博主[炒饭君]原创文章,未经博主同意不得转载 https://blog.csdn.net/a1061747415/article/details/25471349 P ...

  10. HDU 6089 Rikka with Terrorist (线段树)

    题目链接 http://acm.hdu.edu.cn/showproblem.php?pid=6089 题解 这波强行维护搞得我很懵逼... 扫描线,只考虑每个点能走到左上方(不包括正上方,但包括正左 ...

最新文章

  1. 【css】如何使页面压缩时文本内容不换行
  2. 小机上监控AIX和数据库管理系统的运行情况直到性能优化(SQL语句优化和排除硬件问题)...
  3. 【sox】使用sox增加混响效果
  4. Android开发--初识多线程/线程的创建,开启,休眠,中断
  5. epoll监听文件_【原创】万字长文浅析:Epoll与Java Nio的那些事儿
  6. C语言检查一个字符串是否为另一个字符串的子字符串的算法(附完整源码)
  7. ADAMoracle预言机的发展趋势和特点
  8. 使用ADMT3.2迁移域用户
  9. Redis入门第一篇【介绍、安装】
  10. 代码管理学:通过文档记录,实现工作传承
  11. 《Python机器学习——预测分析核心算法》——2.3 对“岩石vs.水雷”数据集属性的可视化展示...
  12. linux不同版本编译,嵌入式ARM+Linux 多个不同版本的交叉编译器的切换方法
  13. 在校大学生研究生软著申请详解及模板下载
  14. 大连理工大学电路计算机,大连理工大学电路计算机辅助分析实验报告.pdf
  15. Ubuntu 16.04下使用Wine安装Windows版的微信(不太完美)
  16. PDF编辑技巧 PDF怎么修改文字
  17. 【Alpha阶段】第五次scrum meeting
  18. jmap常用命令以及dump文件查看
  19. html怎么把字做成动画效果,8个华丽的HTML5文字动画特效赏析
  20. URL中特殊字符的转义

热门文章

  1. list里面的数据按3个字段排序_springboot2.X手册:redis的7种类型100个方法全解析
  2. Super VLAN原理
  3. Python学习笔记—Dict和set
  4. java基础--ObjectInputStream和ObjectInputStream类
  5. CKEditor 实例
  6. Java I/O总结——OutputStream
  7. Java线程间通信方式
  8. 前端开发中,如何优化图像?图像格式的区别?
  9. 马蹄疾 | 聊聊你可能并没有完全掌握的 Flex 布局:从概念入手,丝丝入扣
  10. CentOS 6.5通过yum安装mysql 5.5、5.6、5.7版本