51nod 1559 车和矩形
http://www.51nod.com/Challenge/Problem.html#problemId=1559
倘若矩形是受保护的,那么矩形内每一行至少有一个车或者每一列至少有一个车
判断矩形内每一列都有一个车:
线段树中维护x坐标这一列车的最大y坐标
那么扫描线扫过矩形的上边界时
如果矩形左右边界内,车的最大y坐标中最小的那个大于等于矩形的下边界
那么这个矩形的每一列都有一个车
将车按y坐标从小到大排序,每次扫到一条矩形的上边界,
将y坐标<=这一上边界的车都加入线段树,即用车的y坐标更新线段树
即可实现这一过程
判断矩形每一行都有一个车同理
#include<cstdio>
#include<iostream>
#include<algorithm> using namespace std; #define N 100002 struct car
{
int x,y;
}g[N<<]; struct line
{
int li,ri,ui,di,id;
bool ok;
}e[N<<]; int mi[N<<],tmp; void read(int &x)
{
x=; char c=getchar();
while(!isdigit(c)) c=getchar();
while(isdigit(c)) { x=x*+c-''; c=getchar(); }
} bool cmp1(car p,car q)
{
return p.y<q.y;
} bool cmp2(line p,line q)
{
return p.ui<q.ui;
} bool cmp3(car p,car q)
{
return p.x<q.x;
} bool cmp4(line p,line q)
{
return p.ri<q.ri;
} bool cmp5(line p,line q)
{
return p.id<q.id;
} void build(int k,int l,int r)
{
mi[k]=;
if(l==r) return;
int mid=l+r>>;
build(k<<,l,mid);
build(k<<|,mid+,r);
} void change(int k,int l,int r,int pos,int w)
{
if(l==r)
{
mi[k]=w;
return;
}
int mid=l+r>>;
if(pos<=mid) change(k<<,l,mid,pos,w);
else change(k<<|,mid+,r,pos,w);
mi[k]=min(mi[k<<],mi[k<<|]);
} void query(int k,int l,int r,int opl,int opr)
{
if(l>=opl && r<=opr)
{
tmp=min(tmp,mi[k]);
return;
}
int mid=l+r>>;
if(opl<=mid) query(k<<,l,mid,opl,opr);
if(opr>mid) query(k<<|,mid+,r,opl,opr);
} int main()
{
int n,m,k,q;
read(n); read(m); read(k); read(q);
for(int i=;i<=k;++i)
{
read(g[i].x);
read(g[i].y);
}
int X1,X2,Y1,Y2;
for(int i=;i<=q;++i)
{
read(X1); read(Y1); read(X2); read(Y2);
e[i].li=X1;
e[i].ri=X2;
e[i].ui=Y2;
e[i].di=Y1;
e[i].id=i;
}
int now=;
sort(g+,g+k+,cmp1);
sort(e+,e+q+,cmp2);
for(int i=;i<=q;++i)
{
while(now<=k && g[now].y<=e[i].ui)
{
change(,,n,g[now].x,g[now].y);
now++;
}
tmp=1e6;
query(,,n,e[i].li,e[i].ri);
if(tmp>=e[i].di) e[i].ok=true;
}
now=;
sort(g+,g+k+,cmp3);
sort(e+,e+q+,cmp4);
build(,,m);
for(int i=;i<=q;++i)
{
while(now<=k && g[now].x<=e[i].ri)
{
change(,,m,g[now].y,g[now].x);
now++;
}
if(e[i].ok) continue;
tmp=1e6;
query(,,m,e[i].di,e[i].ui);
if(tmp>=e[i].li) e[i].ok=true;
}
sort(e+,e+q+,cmp5);
for(int i=;i<=q;++i) puts(e[i].ok ? "YES" : "NO");
}
1559 车和矩形
- 1.5 秒
- 131,072.0 KB
- 160 分
- 6级题
波雷卡普有一个n×m,大小的棋盘,上面有k个车。他又放了q个矩形在上面。每一个矩形要受到保护。矩形受到保护的意思是对于该矩形内部所有的格子能够被这个矩形内的某个车攻击到或者被占据,和矩形外面的车无关,即矩形外面的车不能攻击到矩形里面。车的位置是固定的。
样例解释:
对于最后一个矩形,用红色框框表示的,因为(1,2)不能被某个车攻击到,所以是NO。
收起
输入
单组测试数据。
第一行有4个整数 n, m, k 和q (1≤n,m≤100000, 1≤k,q≤200000),表示棋盘大小,棋盘上车的数目,放置矩形的数目。
棋盘的列是从左到右按照1到n编号,行是从下到上按照1到m编号。
接下来k行每一行有两个整数x y(1≤x≤n,1≤y≤m),表示车的位置。输入保证所有车的位置是不一样的。
接下来q行每一行有四个整数x1 y1 x2 y2(1≤x1≤x2≤n, 1≤y1≤y2≤m)。
表示符合x1≤x≤x2, y1≤y≤y2的格子在该矩形内。
输出
对于每一个矩形,如果他是受保护的输出YES,否则输出NO。
输入样例
样例输入1
4 3 3 3
1 1
3 2
2 3
2 3 2 3
2 1 3 3
1 2 2 3
输出样例
样例输出1
YES
YES
NO
51nod 1559 车和矩形的更多相关文章
- 【51nod】1559 车和矩形
题解 离线读入,我们发现一个矩形能被保护,矩形内部所有列上必定有一辆车,或者所有行上必定有一辆车 分两次进行处理 第一次按照横坐标把车加进去,然后查询最大横坐标在这个位置的矩形,纵坐标区间里的车出现位 ...
- 51NOD 1559:车和矩形——题解
http://www.51nod.com/onlineJudge/questionCode.html#!problemId=1559 波雷卡普有一个n×m,大小的棋盘,上面有k个车.他又放了q个矩形在 ...
- UESTC_秋实大哥下棋 2015 UESTC Training for Data Structures<Problem I>
I - 秋实大哥下棋 Time Limit: 3000/1000MS (Java/Others) Memory Limit: 65535/65535KB (Java/Others) Submi ...
- 车大棒浅谈for循环+canvas实现黑客帝国矩形阵
背景: 一日在网上闲逛的之时,突然看到一个利用JQ插件实现canvas实现的电影黑客帝国的小Demo.觉得创意不错,就下载下来研究一下. 网上浏览jQuery的写法 $(document).ready ...
- 51nod 1102 面积最大的矩形 (单调栈)
链接:https://www.51nod.com/onlineJudge/questionCode.html#!problemId=1102 思路: 首先介绍下单调栈的功能:利用单调栈,可以找到从左/ ...
- 51nod 1206 Picture 矩形周长求并 | 线段树 扫描线
51nod 1206 Picture 矩形周长求并 | 线段树 扫描线 #include <cstdio> #include <cmath> #include <cstr ...
- 51nod 1102 面积最大的矩形(单调栈)
http://www.51nod.com/onlineJudge/questionCode.html#!problemId=1102 题意: 思路: 做法就是求出每个长方形向左向右所能延伸的最大距离. ...
- 51nod 1102 面积最大的矩形
题目地址在这儿 求取:以某矩形g[i]为最小值的区间的左右端点,得到一个临时解.所有临时解中的最大值即为解. 求取区间的方法可以用单调栈,也可以用下面这种十分简洁的类似于递归的方法.下面这种解法求出来 ...
- 51nod 2488 矩形并的面积
在二维平面上,给定两个矩形,满足矩形的每条边分别和坐标轴平行,求这个两个矩形的并的面积.即它们重叠在一起的总的面积. 收起 输入 8个数,分别表示第一个矩形左下角坐标为(A,B),右上角坐标为(C ...
随机推荐
- Linux命令:yum命令
YUM: Yellowdog Update Modifier,rpm的前端程序,可解决软件包相关依赖性,可在多个库之间定位软件包,up2date的替代工具 一.yum命令用法 yum repolist ...
- rem与部分手机 字体偏大问题
原因是部分手机自己设置了巨无霸字体.
- [经验] Unity3D 里怎么制作天空盒(skybox)
记载一个简单的 天空盒子 的制作方法 第一步: 在 assets 文件夹下新建一个文件夹, 随便取个名字, 不过最好是用来专门管理场景游戏对象的文件夹, 例如放在这个 Skybox 里: ...
- (转)js实现倒计时效果(年月日时分秒)
原文链接:http://mengqing.org/archives/js-countdown.html 之前做的活动页面很多都用到了倒计时功能,所以整理下下次直接用.(用的是张鑫旭写的一个倒计时,稍作 ...
- Python 基础之循环结构for及break pass continue
一.for 循环 #循环 变量 迭代 都是一个意思#把列表里面的元素意义的拿出来就是遍历listvar = ["one","two","three&q ...
- linux----Nginx能做什么
linux----Nginx能做什么 标签: nginx负载均衡代理服务器 2017-04-01 14:15 588人阅读 评论(0) 收藏 举报 .embody{ padding:10px 10px ...
- Scrapy 使用 Item 封装数据、使用 Item Pipline处理数据
1.Item 和 Field Scrapy 提供一下两个类,用户可以使用它们自定义数据类,封装爬取到的数据: (1)Item类 自定义数据类(如 BookItem)的基类 (2)Field 用来描述自 ...
- node指针
- SVM的使用
注意:数据结构的一致性,在高维度数据一般使用rbf核函数,使用网格搜索思想迭代求出gamma和c. 每行为一个样本,数据类型都围绕标黄代码而定义的. SVM训练如下坐标(左边一列为A类,右边为B类), ...
- 【快学springboot】3.多种接受参数的方式
前往掘金查看:https://juejin.im/post/5d05e5f9f265da1b6c5f74b4 前言 在开发中,我们常常会碰到多种传参的方式.这里,我们就来总结下,springboot中 ...