http://www.51nod.com/onlineJudge/questionCode.html#!problemId=1559

波雷卡普有一个n×m,大小的棋盘,上面有k个车。他又放了q个矩形在上面。每一个矩形要受到保护。矩形受到保护的意思是对于该矩形内部所有的格子能够被这个矩形内的某个车攻击到或者被占据,和矩形外面的车无关,即矩形外面的车不能攻击到矩形里面。车的位置是固定的。

样例解释:

对于最后一个矩形,用红色框框表示的,因为(1,2)不能被某个车攻击到,所以是NO。

题其实不难,但是没有一定的套路基础不好想(你看我这么纯洁也没啥套路啊……)

参考:https://blog.csdn.net/Bahuia/article/details/69555088

一眼看是一个线段树,但是只能维护矩形里面的车所以考虑扫描线。

再思考什么情况下矩形是YES的:每行有车或每列有车。

于是我们只需要做两遍,第二遍把横纵坐标都反过来再做一遍就行了,只要有一个YES就是YES。

那么思路有了,我们要怎么做?

将矩形看做区间查询[x1,x2],将车看做单点修改x2为y2,这样我们将车也看成矩形,对所有矩形y2进行排序,然后按照顺序加,线段树维护区间y坐标最小值。

这样我们区间查询的答案如果>=y1那么就是YES,否则就是NO。

#include<map>
#include<cmath>
#include<stack>
#include<queue>
#include<cstdio>
#include<cctype>
#include<vector>
#include<cstdlib>
#include<cstring>
#include<iostream>
#include<algorithm>
using namespace std;
typedef long long ll;
const int N=4e5+;
const int INF=1e9;
inline int read(){
int X=,w=;char ch=;
while(!isdigit(ch)){w|=ch=='-';ch=getchar();}
while(isdigit(ch))X=(X<<)+(X<<)+(ch^),ch=getchar();
return w?-X:X;
}
struct line{
int x1,y1,x2,y2,w,id;
}d[N];
int n,m,k,q,tr[N];
bool ans[N];
inline bool cmp(line a,line b){
return a.y2==b.y2?a.w<b.w:a.y2<b.y2;
}
void build(int a,int l,int r){
tr[a]=;
if(l==r)return;
int mid=(l+r)>>;
build(a<<,l,mid);build(a<<|,mid+,r);
}
void mdy(int a,int l,int r,int x,int y){
if(l==r){
tr[a]=y;return;
}
int mid=(l+r)>>;
if(x<=mid)mdy(a<<,l,mid,x,y);
else mdy(a<<|,mid+,r,x,y);
tr[a]=min(tr[a<<],tr[a<<|]);
}
int qry(int a,int l,int r,int l1,int r1){
if(r<l1||r1<l)return INF;
if(l1<=l&&r<=r1)return tr[a];
int mid=(l+r)>>;
return min(qry(a<<,l,mid,l1,r1),qry(a<<|,mid+,r,l1,r1));
}
void solve(){
sort(d+,d+q+,cmp);
build(,,n);
for(int i=;i<=q;i++){
if(!d[i].w){
mdy(,,n,d[i].x2,d[i].y2);
}else if(!ans[d[i].id]){
ans[d[i].id]=qry(,,n,d[i].x1,d[i].x2)>=d[i].y1;
}
}
}
int main(){
n=read(),m=read(),k=read(),q=read();
for(int i=;i<=k;i++){
d[i].x2=read();d[i].y2=read();
d[i].w=;
}
for(int i=;i<=q;i++){
d[i+k].x1=read();d[i+k].y1=read();
d[i+k].x2=read();d[i+k].y2=read();
d[i+k].id=i;d[i+k].w=;
}
q+=k;solve();
swap(n,m);
for(int i=;i<=q;i++){
swap(d[i].x1,d[i].y1);
swap(d[i].x2,d[i].y2);
}
solve();
for(int i=;i<=q-k;i++)
if(ans[i])puts("YES");
else puts("NO");
return ;
}

+++++++++++++++++++++++++++++++++++++++++++

+本文作者:luyouqi233。               +

+欢迎访问我的博客:http://www.cnblogs.com/luyouqi233/ +

+++++++++++++++++++++++++++++++++++++++++++

51NOD 1559:车和矩形——题解的更多相关文章

  1. 51nod 1559 车和矩形

    http://www.51nod.com/Challenge/Problem.html#problemId=1559 倘若矩形是受保护的,那么矩形内每一行至少有一个车或者每一列至少有一个车 判断矩形内 ...

  2. 【51nod】1559 车和矩形

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

  3. 51nod 最近刷题 简要题解

    51nod 1564 由于数据是随机的,可以证明,对于每一个数,向左或右找比它小的数,长度是logn级别的 考虑枚举最大值 注意,对于每一个最大值,如果直接用2个循环枚举左右端点的话,理论是lognl ...

  4. 51NOD 1227:平均最小公倍数——题解

    http://www.51nod.com/onlineJudge/questionCode.html#!problemId=1227 懒得打公式了,看这位的吧:https://blog.csdn.ne ...

  5. 洛谷 P1191 矩形 题解

    P1191 矩形 题目描述 给出一个 \(n \times n\)的矩阵,矩阵中,有些格子被染成白色,有些格子被染成黑色,现要求矩阵中白色矩形的数量 输入格式 第一行,一个整数\(n\),表示矩形的大 ...

  6. HDU -1506 Largest Rectangle in a Histogram&&51nod 1158 全是1的最大子矩阵 (单调栈)

    单调栈和队列讲解:传送门 HDU -1506题意: 就是给你一些矩形的高度,让你统计由这些矩形构成的那个矩形面积最大 如上图所示,如果题目给出的全部是递增的,那么就可以用贪心来解决 从左向右依次让每一 ...

  7. 51nod 1244 莫比乌斯函数之和

    题目链接:51nod 1244 莫比乌斯函数之和 题解参考syh学长的博客:http://www.cnblogs.com/AOQNRMGYXLMV/p/4932537.html %%% 关于这一类求积 ...

  8. 【BZOJ2338】[HNOI2011]数矩形 几何

    [BZOJ2338][HNOI2011]数矩形 题解:比较直观的做法就是枚举对角线,两个对角线能构成矩形当且仅当它们的长度和中点相同,然后用到结论:n个点构成的矩形不超过n^2.5个(不会证),所以两 ...

  9. P1115 最大子段和&P1719 最大加权矩形

    上接:DP&图论 DAY 1 上午 这两个题本质是一个亚子,所以放一起啦 DPDPDPDPDPDPDPDP P1115 最大子段和 题解 因为题目要求的是一段连续的区间,所以前缀和搞暴力??? ...

随机推荐

  1. Python接口测试实战5(上) - Git及Jenkins持续集成

    如有任何学习问题,可以添加作者微信:lockingfree 课程目录 Python接口测试实战1(上)- 接口测试理论 Python接口测试实战1(下)- 接口测试工具的使用 Python接口测试实战 ...

  2. 转 gerrit

    开发环境 https://blog.csdn.net/u013207966/article/details/79112740 先记录下我的开发环境以及要正确安装gerrit需要用到的工具: Redha ...

  3. 解决Sublime Text 3中文显示乱码(tab中文方块)问题

    博客分类:  Sublime   一.文本出现中文乱码问题 1.打开Sublime Text 3,按Ctrl+-打开控制行,复制粘贴以下python代码,然后回车运行. 2. 复制并粘贴如下代码: P ...

  4. 这才是球王应有的技艺,他就是C罗

    四年一度的世界杯在本周四拉开了帷幕,俄罗斯以5:0碾压沙特阿拉伯,让我们惊呼战斗名族的强大,其后的摩洛哥VS伊朗,摩洛哥前锋布哈杜兹将足球顶入自家球门,这......咳,咳,本来是为了解围,没想到成就 ...

  5. 导出Office365中的组及成员

    Set-ExecutionPolicy unrestricted $cred = Get-Credential  $session = New-PSSession -ConfigurationName ...

  6. .net mvc5 不同view()的视图 代码

    public class Test { public int id { set; get; } public string name { set; get; } } public ActionResu ...

  7. 笔试题:C++打印队列

    题目:打印队列 题目介绍:现在用打印机打印队列,已知打印任务有9个优先级(1-9),现在给出一系列任务,求输出打印顺序(任务下标,从0开始). 例: 输入:9,3,5,4,7,1 输出:0,4,2,3 ...

  8. CSS布局之圣杯布局和双飞翼布局

    其实圣杯布局和双飞翼布局实现的都是三栏布局,两边的盒子宽度固定,中间盒子自适应,也就是我们常说的固比固布局.它们实现的效果都是一样的,差别在于其实现的思想. 一.圣杯布局 html代码中,将重要的内容 ...

  9. Alpha发布用户使用报告

    此作业要求参见:[https://edu.cnblogs.com/campus/nenu/2018fall/homework/2325] 组名:可以低头,但没必要 组长:付佳 组员:张俊余 李文涛 孙 ...

  10. c# WPS DLL及其调用

    1.dll分享(含xsl及docx的dll) 链接:https://pan.baidu.com/s/1c1ImV14OndmvIb4W-_WL2A 密码:d2rx 2.方法: 1.先在类的前面(类外面 ...