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. CF 1073 E. Segment Sum

    https://codeforces.com/problemset/problem/1073/E 题意:[l,r]中,出现0—9数字的种类数不超过k的数的和 dp[i][j][0/1] 表示 dfs到 ...

  2. java记录1--接口

    接口(interface)定义:抽象方法和常量值的集合.本质上讲,接口是一种特殊的抽象类 ps:1.接口中定义的属性必须是public static final 的,定义的方法必须是public ab ...

  3. 阿里分布式开放消息服务(ONS)原理与实践——笔记整理

    1.MQ场景    1)订单异步解耦    2)解决分布式事务问题    3)应用于聊天平台    4)大规模机器的Cache同步    5)MySQL BinLog订阅数据分发2.ONS应用场景  ...

  4. Python 基础之字符串操作,函数及格式化format

    一.字符串的相关操作 1.字符串的拼接 + strvar1 = "我爱你,"strvar2 = "亲爱的姑凉"res = strvar1 + strvar2pr ...

  5. SpringBoot 集成FreeMarker

    SpringBoot官方不推荐使用jsp,因为jsp不好发挥SpringBoot的特性.官方推荐使用模板引擎代替jsp,现在很多公司都使用FreeMarker来作为SpringBoot的视图. Spr ...

  6. [python]ubuntu下的python2和python3

    在终端分别输入python,python2,python3python和python2默认都是python2python3才是python3 Ubuntu下是默认没有pip的,需要自己手动安装 sud ...

  7. ecshop 资料整理

    ecshop 资料整理   lib_base.php 基础函数库1.sub_str($str, $length = 0, $append = true) 截取UTF-8编码下字符串的函数 string ...

  8. SQLite、MySQL和PostgreSQL 三种关系数据库哪个好?

    关系型数据库的使用已经有相当长的时间了.它们变得流行起来托了管理系统的福,关系模型被实现得相当的好,并且被证明是操作数据的好方法(特别是事务性强的应用). 在这篇DigitalOcean文章中,我们将 ...

  9. python之字符串,列表,字典,元组,集合内置方法总结

    目录 数字类型的内置方法 整型/浮点型 字符串类型的内置方法 列表的内置方法 字典的内置方法 元组的内置方法 集合类型内置方法 布尔类型 数据类型总结 数字类型的内置方法 整型/浮点型 加 + 减 - ...

  10. 吴裕雄 Bootstrap 前端框架开发——Bootstrap 按钮:激活状态

    <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title> ...