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. StringBuilder为什么线程不安全(面试必问)

    文章转载自:https://juejin.im/post/5d6228046fb9a06add4e37fe 作者:千山qianshan 1.引言 周五去面试又被面试的一个问题问哑巴了 面试官:Stri ...

  2. java代理模式的实现方法

    package com.sample.sping_ireport.cglib; import java.lang.reflect.InvocationHandler; import java.lang ...

  3. gradle 打包所有依赖 Invalid signature file digest for Manifest main attributes(转)

    1.打包所有依赖: // 指定main函数的类 jar { manifest { attributes "Main-Class": "com.baeldung.fatja ...

  4. ls命令与cd命令

    ls命令用于显示文件目录列表,当使用ls命令时,默认显示的只有非隐藏文件或文件夹(隐藏文件在linux中前面有 ' . ' ),当不加参数时,显示当前目录. 1.ls命令语法 ls [参数][目标文件 ...

  5. 深度解析Java可变参数类型以及与数组的区别

    注意:可变参数类型是在jdk1.5版本的新特性,数组类型是jdk1.0就有了. 这篇文章主要介绍了Java方法的可变参数类型,通过实例对Java中的可变参数类型进行了较为深入的分析,需要的朋友可以参考 ...

  6. c-指针的理解

    c-指针的理解 最近在学习MFC,其中的代码有点看的不是很深刻,究其原因还是对c语言中的指针理解的不是很好,下面详细的给大家介绍一下指针,如有不当之处,欢迎各位读者指正. 一.指针的概念 C语言里,变 ...

  7. Law of large numbers and Central limit theorem

    大数定律 Law of large numbers (LLN) 虽然名字是 Law,但其实是严格证明过的 Theorem weak law of large number (Khinchin's la ...

  8. Burp Suite Pro1.7.36破解版

    百度网盘下载(H大会一直更新):链接: https://pan.baidu.com/s/1brjPKM7 密码: 9v4r 爱盘下载:https://down.52pojie.cn/Tools/Net ...

  9. Python学习笔记之基础篇(五)字典

    #数据类型划分:可变数据类型 不可变数据类型 #不可变数据类型 : 元组 bool int str --> 可哈希 #可变数据类型 list ,dict set --->不可哈希 ''' ...

  10. Linux 创建网卡子接口

    创建网卡子接口,添加IP别名 ifconfig eth0:0  2.2.2.2/24 或 ip addr add 2.2.2.2/24 dev eth0 label eth0:0 清除网卡子接口,删除 ...