【51nod】1559 车和矩形
题解
离线读入,我们发现一个矩形能被保护,矩形内部所有列上必定有一辆车,或者所有行上必定有一辆车
分两次进行处理
第一次按照横坐标把车加进去,然后查询最大横坐标在这个位置的矩形,纵坐标区间里的车出现位置的最小值有没有超过最小横坐标
第二次按照纵坐标把车加进去,然后查询最大纵坐标所在位置的矩形,横坐标区间里的车出现位置的最小值有没有超过最小纵坐标
用线段树维护区间即可
代码
#include <iostream>
#include <algorithm>
#include <cstdio>
#include <cstring>
#include <vector>
#include <set>
#include <cmath>
#include <bitset>
#include <queue>
#define enter putchar('\n')
#define space putchar(' ')
//#define ivorysi
#define pb push_back
#define mo 974711
#define pii pair<int,int>
#define mp make_pair
#define fi first
#define se second
#define MAXN 200005
#define eps 1e-12
using namespace std;
typedef long long int64;
typedef double db;
template<class T>
void read(T &res) {
res = 0;char c = getchar();T f = 1;
while(c < '0' || c > '9') {
if(c == '-') f = -1;
c = getchar();
}
while(c >= '0' && c <= '9') {
res = res * 10 - '0' + c;
c = getchar();
}
res = res * f;
}
template<class T>
void out(T x) {
if(x < 0) {x = -x;putchar('-');}
if(x >= 10) out(x / 10);
putchar('0' + x % 10);
}
int N,M,K,Q;
bool ans[MAXN];
struct Matrix {
int x1,x2,y1,y2;
}mat[MAXN];
pii C[MAXN];
struct Ins_node {
int pos,w;
friend bool operator < (const Ins_node &a,const Ins_node &b) {
return a.pos < b.pos;
}
}Ins[MAXN];
struct Qry_node {
int l,r,s,t,id;
friend bool operator < (const Qry_node &a,const Qry_node &b) {
return a.t < b.t;
}
}Qry[MAXN];
struct tr_node {
int l,r;
int minv;
}tr[MAXN * 4];
void build(int u,int l,int r) {
tr[u].l = l;tr[u].r = r;
tr[u].minv = 0;
if(l == r) return;
int mid = (l + r) >> 1;
build(u << 1,l,mid);
build(u << 1 | 1,mid + 1,r);
}
void update(int u) {
tr[u].minv = min(tr[u << 1].minv,tr[u << 1 | 1].minv);
}
void Change(int u,int pos,int v) {
if(tr[u].l == tr[u].r) {tr[u].minv = v;return;}
int mid = (tr[u].l + tr[u].r) >> 1;
if(pos <= mid) Change(u << 1,pos,v);
else Change(u << 1 | 1,pos,v);
update(u);
}
int Query(int u,int l,int r) {
if(tr[u].l == l && tr[u].r == r) return tr[u].minv;
int mid = (tr[u].l + tr[u].r) >> 1;
if(r <= mid) return Query(u << 1,l,r);
else if(l > mid) return Query(u << 1 | 1,l,r);
else return min(Query(u << 1,l,mid),Query(u << 1 | 1,mid + 1,r));
}
void Process(int L) {
sort(Ins + 1,Ins + K + 1);
sort(Qry + 1,Qry + Q + 1);
build(1,1,max(N,M));
int p = 1,h = 1;
for(int i = 1 ; i <= L ; ++i) {
while(p <= K && Ins[p].pos <= i) {
Change(1,Ins[p].w,Ins[p].pos);
++p;
}
while(h <= Q && Qry[h].t <= i) {
if(!ans[Qry[h].id]) {
if(Query(1,Qry[h].l,Qry[h].r) >= Qry[h].s) ans[Qry[h].id] = 1;
}
++h;
}
}
}
void Solve() {
read(N);read(M);read(K);read(Q);
int x,y;
for(int i = 1 ; i <= K ; ++i) {
read(x);read(y);
C[i] = mp(x,y);
}
for(int i = 1 ; i <= Q ; ++i) {
read(mat[i].x1);read(mat[i].y1);read(mat[i].x2);read(mat[i].y2);
}
for(int i = 1 ; i <= K ; ++i) {
Ins[i].pos = C[i].fi;Ins[i].w = C[i].se;
}
for(int i = 1 ; i <= Q ; ++i) {
Qry[i] = (Qry_node){mat[i].y1,mat[i].y2,mat[i].x1,mat[i].x2,i};
}
Process(N);
for(int i = 1 ; i <= K ; ++i) {
Ins[i].pos = C[i].se;Ins[i].w = C[i].fi;
}
for(int i = 1 ; i <= Q ; ++i) {
Qry[i] = (Qry_node){mat[i].x1,mat[i].x2,mat[i].y1,mat[i].y2,i};
}
Process(M);
for(int i = 1 ; i <= Q ; ++i) {
if(ans[i]) puts("YES");
else puts("NO");
}
}
int main() {
#ifdef ivorysi
freopen("f1.in","r",stdin);
#endif
Solve();
}
【51nod】1559 车和矩形的更多相关文章
- 51nod 1559 车和矩形
http://www.51nod.com/Challenge/Problem.html#problemId=1559 倘若矩形是受保护的,那么矩形内每一行至少有一个车或者每一列至少有一个车 判断矩形内 ...
- 51NOD 1559:车和矩形——题解
http://www.51nod.com/onlineJudge/questionCode.html#!problemId=1559 波雷卡普有一个n×m,大小的棋盘,上面有k个车.他又放了q个矩形在 ...
- UESTC_秋实大哥下棋 2015 UESTC Training for Data Structures<Problem I>
I - 秋实大哥下棋 Time Limit: 3000/1000MS (Java/Others) Memory Limit: 65535/65535KB (Java/Others) Submi ...
- 车大棒浅谈for循环+canvas实现黑客帝国矩形阵
背景: 一日在网上闲逛的之时,突然看到一个利用JQ插件实现canvas实现的电影黑客帝国的小Demo.觉得创意不错,就下载下来研究一下. 网上浏览jQuery的写法 $(document).ready ...
- 51nod 1102 面积最大的矩形 (单调栈)
链接:https://www.51nod.com/onlineJudge/questionCode.html#!problemId=1102 思路: 首先介绍下单调栈的功能:利用单调栈,可以找到从左/ ...
- 51nod 1206 Picture 矩形周长求并 | 线段树 扫描线
51nod 1206 Picture 矩形周长求并 | 线段树 扫描线 #include <cstdio> #include <cmath> #include <cstr ...
- 51nod 1102 面积最大的矩形(单调栈)
http://www.51nod.com/onlineJudge/questionCode.html#!problemId=1102 题意: 思路: 做法就是求出每个长方形向左向右所能延伸的最大距离. ...
- 51nod 1102 面积最大的矩形
题目地址在这儿 求取:以某矩形g[i]为最小值的区间的左右端点,得到一个临时解.所有临时解中的最大值即为解. 求取区间的方法可以用单调栈,也可以用下面这种十分简洁的类似于递归的方法.下面这种解法求出来 ...
- 51nod 2488 矩形并的面积
在二维平面上,给定两个矩形,满足矩形的每条边分别和坐标轴平行,求这个两个矩形的并的面积.即它们重叠在一起的总的面积. 收起 输入 8个数,分别表示第一个矩形左下角坐标为(A,B),右上角坐标为(C ...
随机推荐
- 科学计算三维可视化---TraitsUI的介绍
TraitsUI的介绍 Python中存在Tkinter,wxPython,pyQt4等GUI图像界面编写库,这三类库要求程序员掌握众多的GUI API函数 对于科学计算的应用来说,我们希望可以快速的 ...
- Ubuntu 搭建svn服务器 ,以及常见错误解决方案
一.安装命令: 1)以root身份登录.执行:sudo su -命令 2)执行安装命令:apt-get install subversion 二.创建项目目录 1)mkdir /home/svn ...
- kibana做图表无法选取需要选的字段
kibana做图表无法选取需要选的字段,即通过term的方式过滤选择某一个field时发现列表里无此选项. 再去discover里看,发现此字段前面带有问号,点击后提示这个字段未做索引,不能用于vis ...
- webapi框架搭建-安全机制(二)-身份验证
webapi框架搭建系列博客 身份验证(authentication)的责任是识别出http请求者的身份,除此之外尽量不要管其它的事.webapi的authentication我用authentica ...
- git 提交模板配置
1.创建模板文件,比如gitTemplate.txt,内容如下: ABSTRACT:修改自测发现的多度数据同步相关问题. Bug Fix [Y/N]:NBug ID:New Feature [Y/N] ...
- git 分支管理——多人协作
git 分支管理--多人协作 一般一个项目有一个master主分支,还有一个develop开发分支.主要是在develop分支上协作开发,然后merge合并到master主分支上. 当从远程仓库克隆时 ...
- CF&&CC百套计划2 CodeChef December Challenge 2017 Chef And his Cake
https://www.codechef.com/DEC17/problems/GIT01 #include<cstdio> #include<algorithm> using ...
- bzoj千题计划131:bzoj3993: [SDOI2015]星际战争
http://www.lydsy.com/JudgeOnline/problem.php?id=3993 二分答案 源点向武器连 mid*攻击力的边 机器人向汇点连 防御力 的边 武器i能攻击机器人j ...
- [洛谷P4492] [HAOI2018]苹果树
洛谷题目链接:[HAOI2018]苹果树 题目背景 HAOI2018 Round2 第一题 题目描述 小 C 在自己家的花园里种了一棵苹果树, 树上每个结点都有恰好两个分支. 经过细心的观察, 小 C ...
- 20155305乔磊2016-2017-2《Java程序设计》第八周学习总结
20155305乔磊2016-2017-2<Java程序设计>第八周学习总结 教材学习内容总结 通用API 日志API 1.java.util.logging包提供了日志功能相关类与接口, ...