(转)【NOIP模拟题】【线段树】【扫描线】2016.11.17 第三题 矩形 题解

因为今天的第三题不会(其实是不想打),所以转来一篇某大大的题解。
转自@Star_Weeper

矩形
文件名: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
此题无小数据

写了个图片解释
(转)【NOIP模拟题】【线段树】【扫描线】2016.11.17 第三题 矩形 题解_第1张图片

吐槽一下。暴力我过了60分。
出题人真TM坑。

贴一下题解

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

你可能感兴趣的:(t68,NOIP模拟题,线段树,扫描线)