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. 1.5 秒
  2. 131,072.0 KB
  3. 160 分
  4. 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 车和矩形的更多相关文章

  1. 【51nod】1559 车和矩形

    题解 离线读入,我们发现一个矩形能被保护,矩形内部所有列上必定有一辆车,或者所有行上必定有一辆车 分两次进行处理 第一次按照横坐标把车加进去,然后查询最大横坐标在这个位置的矩形,纵坐标区间里的车出现位 ...

  2. 51NOD 1559:车和矩形——题解

    http://www.51nod.com/onlineJudge/questionCode.html#!problemId=1559 波雷卡普有一个n×m,大小的棋盘,上面有k个车.他又放了q个矩形在 ...

  3. UESTC_秋实大哥下棋 2015 UESTC Training for Data Structures<Problem I>

    I - 秋实大哥下棋 Time Limit: 3000/1000MS (Java/Others)     Memory Limit: 65535/65535KB (Java/Others) Submi ...

  4. 车大棒浅谈for循环+canvas实现黑客帝国矩形阵

    背景: 一日在网上闲逛的之时,突然看到一个利用JQ插件实现canvas实现的电影黑客帝国的小Demo.觉得创意不错,就下载下来研究一下. 网上浏览jQuery的写法 $(document).ready ...

  5. 51nod 1102 面积最大的矩形 (单调栈)

    链接:https://www.51nod.com/onlineJudge/questionCode.html#!problemId=1102 思路: 首先介绍下单调栈的功能:利用单调栈,可以找到从左/ ...

  6. 51nod 1206 Picture 矩形周长求并 | 线段树 扫描线

    51nod 1206 Picture 矩形周长求并 | 线段树 扫描线 #include <cstdio> #include <cmath> #include <cstr ...

  7. 51nod 1102 面积最大的矩形(单调栈)

    http://www.51nod.com/onlineJudge/questionCode.html#!problemId=1102 题意: 思路: 做法就是求出每个长方形向左向右所能延伸的最大距离. ...

  8. 51nod 1102 面积最大的矩形

    题目地址在这儿 求取:以某矩形g[i]为最小值的区间的左右端点,得到一个临时解.所有临时解中的最大值即为解. 求取区间的方法可以用单调栈,也可以用下面这种十分简洁的类似于递归的方法.下面这种解法求出来 ...

  9. 51nod 2488 矩形并的面积

    在二维平面上,给定两个矩形,满足矩形的每条边分别和坐标轴平行,求这个两个矩形的并的面积.即它们重叠在一起的总的面积. 收起   输入 8个数,分别表示第一个矩形左下角坐标为(A,B),右上角坐标为(C ...

随机推荐

  1. Linux 添加新磁盘 && 创建分区 && 挂载

    参考: 挂载目录 分区:https://blog.csdn.net/arenn/article/details/78866251 挂载:https://www.jb51.net/article/108 ...

  2. DuiLib中FlashDemo的例子经验杂粹1

    转载:https://www.jianshu.com/p/3e958ae9e5ab 最近用duilib做个东西,经常卡壳 ,而且以前学的现在又忘.现在觉得应该好好做笔记,以前老是觉得博客是很郑重的东西 ...

  3. HTML table表头排序箭头绘制法【不用箭头图片】

    效果图 代码 <!DOCTYPE html> <html lang="en"> <head> <meta charset="ut ...

  4. 大数据萌新的Python学习之路(一)

    笔记开始简介 从2018年9月份正式进入大学的时代,大数据和人工智能的崛起让我选择了计算机专业学习数据科学与大数据技术专业,接触的第一门语言就是C语言,后来因为同学推荐的原因进入了学校的人工智能研究协 ...

  5. 窥探QQ基础数据库架构演变史

    作为腾讯最核心最基础的后台服务之一,QQ基础数据库是存储QQ用户帐户信息和关系链信息的海量集群,它承载了百万级每秒的访问量.十亿级的账户数.百亿级关系链.如此大规模的集群,它是如何从300万的数量级一 ...

  6. LibreOJ #6008. 「网络流 24 题」餐巾计划

    这道题其实我在刚学 OI 的时候就在一本通上看见过,还记得上面写着"新餐巾一次性买完"之类的话.当时还很稚嫩(现在也是),想了好久,根本想不出来. 学了网络流之后发现这道题的图也是 ...

  7. 你知道HTTP协议的ETag是干什么的吗?

    前言 在HTTP1.1规范中,新增了一个HTTP头信息:ETag.对于普通开发者来说,可能平时真的不会接触到该HTTP头.平时接触不到或者说用得少,不代表这个请求头不重要.ETag使用得当,是可以减少 ...

  8. QQ企业通---登录模块设计--知识点

    Rectangle 成员  存储一组整数,共四个,表示一个矩形的位置和大小.对于更高级的区域函数,请使用 Region 对象. Form与Control的区别? 窗体也是控件,继承Control类.可 ...

  9. 记录下spingboot连接阿里云服务器上的MySQL数据库报错

    错误大概如下: create connection SQLException, url: jdbc:mysql://'IP地址':3306/code007?useUnicode=true&ch ...

  10. Hibernate all-delete-orphan[转]

    博客分类: SSH   当关联双方存在父子关系,就可以在 set 处设定 cascade 为 all-delete-orphan 所谓父子关系,即指由父方控制子方的持久化圣明周期,子方对象必须和一个父 ...