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. 【转载】手把手教你使用Git(简单,实用)

    手把手教你使用Git(简单,实用) 标签: git 2016年04月21日 20:51:45 1328人阅读 评论(0) 收藏 举报 一:Git是什么? Git是目前世界上最先进的分布式版本控制系统. ...

  2. 正确使用 Android 的 Theme 和 Style

    原文:http://www.tuicool.com/articles/ZjEZFj Android 5.0 可以给一个 View 单独设置一个 theme 了,其主要用途就是用在 ToolBar 上, ...

  3. 科软-信息安全实验3-Rootkit劫持系统调用

    目录 一 前言 二 Talk is cheap, show me the code 三 前期准备 四 效果演示 五 遇到的问题&解决 六 18.04的坑 七 参考资料 八 老师可能的提问 一 ...

  4. 2019上海爱奇艺大数据Java实习生-面试记录

    目录 一轮 电话面试 二轮 代码笔试 三轮 技术面试 总结 附:电话面试问题点解惑 补充:面试未通过 一轮 电话面试 2019.04.28 16:21 [w]:面试官,[m]:我,下面的内容来自电话录 ...

  5. python语言入门

    1.python语言是一种高级的脚本语言,诞生于1991年. 2.python是目前主流的编程语言,具有超高的人气,是因为它是目前大数据与人工智能的语言基础,应用范围非常广泛. 3.python语言是 ...

  6. 《React后台管理系统实战 :三》header组件:页面排版、天气请求接口及页面调用、时间格式化及使用定时器、退出函数

    一.布局及排版 1.布局src/pages/admin/header/index.jsx import React,{Component} from 'react' import './header. ...

  7. Django:验证码相关问题

    http://blog.csdn.net/csapr1987/article/details/7728315 https://zhidao.baidu.com/question/13837387222 ...

  8. AJAX的表单请求POST请求方式

    表单数据的提交 action : 数据提交的地址,默认是当前页面 method : 数据提交的方式,默认是get方式 post: 把数据名称和数据值用=连接,如果有多个的话,那么他会把多个数据组合用& ...

  9. 通过开源项目免费申请 IntelliJ IDEA license(激活码)

    通过github开源项目免费申请 IntelliJ IDEA license(激活码) 我用来申请的github开源项目:https://github.com/Linliquan/springboot ...

  10. Day9 - A - Apple Catching POJ - 2385

    Description 有两棵APP树,编号为1,2.每一秒,这两棵APP树中的其中一棵会掉一个APP.每一秒,你可以选择在当前APP树下接APP,或者迅速移动到另外一棵APP树下接APP(移动时间可 ...