【扫描线】【矩阵】

矩形
文件名:brother.pas/c/cpp
时限:1S
空间:256M
Description
胜负胸中料已明,又从堂上出奇兵。秋实大哥是一个下棋好手,独孤求败的他觉得下棋已经无法满足他了,他开始研究一种新的玩法。
在一个n×m的棋盘上,放置了k个车,并且他在棋盘上标出了q个矩形,表示矩形内部是战略要地。
秋实大哥要求一个矩形内的每一个格子,都至少能被一辆在矩形内的车攻击到,那么这个矩形就是被完整保护的。
现在秋实大哥想知道每一个矩形是否被完整保护。
Input
第一行包含四个整数n,m,k,q,表示棋盘的大小,车的数量以及矩形的数量。
接来下k行,每行包含两个整数x,y,表示有一辆车位于从左往右第x列,从下往上第y行。
接下来q行,每行包含四个整数x1,y1,x2,y2,表示一个矩形的左下角和右上角坐标。
1≤n,m≤1e5,1≤k,q≤2e5,1≤x1≤x2≤1e5,1≤y1≤y2≤1e5,1≤x≤1e5,1≤y≤1e5。
Output
输出q行,对于每一次询问,这个矩形若被完整保护了输出”YES”,否则输出”NO”。
Sample input
4 3 3 3
1 1
3 2
2 3
2 3 2 3
2 1 3 3
1 2 2 3
Sample Output
YES
YES
NO
Limit
此题无小数据

写了个图片解释

这里写图片描述
吐槽一下。暴力我过了60分。
出题人真TM坑。

贴一下题解

矩形
扫描线+线段树
对于一个矩形如果它能被覆盖,则从水平或者竖直方向,必定存在某个方向上每个横线或者竖线上都有车
使用扫描线从左往右扫,我们把每个矩形拆分为入边和出边,对每个矩形加上所有的车按照出边排序(即x坐标排序)
现在我们维护一个线段树,以y坐标为下标,保存这个位置x最大的车的x标,再维护区间最小值
对于每一个车,我们直接在对应位置更新
对于每一个矩形,我们现在是在它的出边位置考虑,那么我们只需要知道出边之内是不是每一个横线上都有一个车
那么查询对应出边的y坐标所夹的那个区间,是否存在一个车,它的最小值比出边的x坐标小
由此即可判断一个矩形有没有被水平方向的车覆盖
同理,我们在竖直方向同样处理一遍,即可知道每个矩形是否被车覆盖矩形
扫描线+线段树
对于一个矩形如果它能被覆盖,则从水平或者竖直方向,必定存在某个方向上每个横线或者竖线上都有车
使用扫描线从左往右扫,我们把每个矩形拆分为入边和出边,对每个矩形加上所有的车按照出边排序(即x坐标排序)
现在我们维护一个线段树,以y坐标为下标,保存这个位置x最大的车的x标,再维护区间最小值
对于每一个车,我们直接在对应位置更新
对于每一个矩形,我们现在是在它的出边位置考虑,那么我们只需要知道出边之内是不是每一个横线上都有一个车
那么查询对应出边的y坐标所夹的那个区间,是否存在一个车,它的最小值比出边的x坐标小
由此即可判断一个矩形有没有被水平方向的车覆盖
同理,我们在竖直方向同样处理一遍,即可知道每个矩形是否被车覆盖

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值