题意:n*m的矩阵,给出k个点,Q次询问,问每个矩阵中每个点是否被看管,一个点被看管的定义是那个点所在的行或列有点,n,m<=1e5,k,q<=2e5

sol :发现行和列是独立的,即要么每行都有点或每列都有点,所以可以用线段树艹,对于x建线段树,对于所有y<=y2的点加入y的坐标,询问x1,x2中y的最小值是否>=y1即可(x1,y1,x2,y2是查询矩阵的左下右上)

#include <bits/stdc++.h>
using namespace std;
typedef int ll;
inline ll read()
{
ll s=; bool f=; char ch=' ';
while(!isdigit(ch)) {f|=(ch=='-'); ch=getchar();}
while(isdigit(ch)) {s=(s<<)+(s<<)+(ch^); ch=getchar();}
return (f)?(-s):(s);
}
#define R(x) x=read()
inline void write(ll x)
{
if(x<) {putchar('-'); x=-x;}
if(x<) {putchar(x+''); return;}
write(x/); putchar((x%)+'');
}
#define W(x) write(x),putchar(' ')
#define Wl(x) write(x),putchar('\n')
const int B=,N=;
int n,m,k,Q;
bool ans[N];
struct point
{
int x,y;
inline bool operator<(const point &tmp)const
{
return y<tmp.y;
}
}sb[N];
struct xunwen
{
int x1,y1,x2,y2,id;
inline bool operator<(const xunwen &tmp)const
{
return y2<tmp.y2;
}
}xw[N];
struct node{int mn;}T[B<<];
#define c1 (x<<1)
#define c2 (x<<1|1)
inline void build(int x,int l,int r)
{
T[x].mn=; if(l==r) return;
int mid=(l+r)>>;
build(c1,l,mid); build(c2,mid+,r);
T[x].mn=min(T[c1].mn,T[c2].mn);
}
inline void chag(int x,int l,int r,int pos,int val)
{
if(l==r)
{
T[x].mn=max(T[x].mn,val); return;
}
int mid=(l+r)>>;
if(pos<=mid) chag(c1,l,mid,pos,val);
else chag(c2,mid+,r,pos,val);
T[x].mn=min(T[c1].mn,T[c2].mn);
}
inline int que(int x,int l,int r,int ql,int qr)
{
if(l==ql&&r==qr) return T[x].mn;
int mid=(l+r)>>;
if(qr<=mid) return que(c1,l,mid,ql,qr);
else if(ql>mid) return que(c2,mid+,r,ql,qr);
else return min(que(c1,l,mid,ql,mid),que(c2,mid+,r,mid+,qr));
}
inline void Solve()
{
int i,j=;
build(,,n);
sort(sb+,sb+k+);
sort(xw+,xw+Q+);
for(i=;i<=Q;i++)
{
while(j<=k&&sb[j].y<=xw[i].y2)
{
chag(,,n,sb[j].x,sb[j].y); j++;
}
int oo=que(,,n,xw[i].x1,xw[i].x2);
if(oo>=xw[i].y1) ans[xw[i].id]=;
}
}
int main()
{
freopen("codeforces524E_data.in","r",stdin);
int i;
memset(ans,,sizeof ans);
R(n); R(m); R(k); R(Q);
for(i=;i<=k;i++) R(sb[i].x),R(sb[i].y);
for(i=;i<=Q;i++)
{
R(xw[i].x1); R(xw[i].y1); R(xw[i].x2); R(xw[i].y2); xw[i].id=i;
}
Solve();
swap(n,m);
for(i=;i<=k;i++) swap(sb[i].x,sb[i].y);
for(i=;i<=Q;i++)
{
swap(xw[i].x1,xw[i].y1); swap(xw[i].x2,xw[i].y2);
}
Solve();
for(i=;i<=Q;i++)
{
if(ans[i]) puts("YES"); else puts("NO");
}
return ;
}

codeforces524E的更多相关文章

随机推荐

  1. 在论坛中出现的比较难的sql问题:31(row_number函数+子查询 月环比计算)

    原文:在论坛中出现的比较难的sql问题:31(row_number函数+子查询 月环比计算) 所以,觉得有必要记录下来,这样以后再次碰到这类问题,也能从中获取解答的思路.

  2. 解决SVN蓝色问号的问题

    桌面或文件夹右键,选择TortoiseSVN->Settings打开设置对话框,选择Icon Overlays->Overlay Handlers->取消钩选Unversioned. ...

  3. VS.NET(C#)--2.9_HTML服务器控件案例

    HTML服务区控件案例 UI设计视图 UI源码视图 <>

  4. Python之算法模型-5.1

    一.这里学习的算法模型包含监督学习和非监督学习两个方式的算法. 其中监督学习的主要算法分为(分类算法,回归算法),无监督学习(聚类算法),这里的几种算法,主要是学习他们用来做预测的效果和具体的使用方式 ...

  5. H5 新增标签canvas 画布

    canvas是写在body中的标签,设置宽高后,通过JS来往其中绘制想要的内容, canvas可以理解为一个画板,而JS就是你的画笔. 1.获取到画布 var canvas = document.ge ...

  6. SAP Leonardo图片处理相关的机器学习服务在SAP智能服务场景中的应用

    本文作为Jerry最近正在做的一个项目的工作思路的梳理. 我们假设这样一个服务场景,技师上门维修某设备,发现设备上某零件损坏了,假设这位技师由于种种原因,没能根据自己的经验识别出这个零件的型号.此时技 ...

  7. Vue指令之`v-model`和`双向数据绑定

     v-bind 只能实现数据的单向绑定,从 M 自动绑定到 V, 无法实现数据的双向绑定 <input type="text" v-bind:value="msg& ...

  8. MySQL运行机制原理&架构

    1.MySQL知识普及: MySQL是一个开放源代码的关系数据库管理系统. MySQL架构可以在多种不同场景中应用并发挥良好作用.主要体现在存储引擎的架构上,插件式的存储引擎架构将查询处理和其它的系统 ...

  9. Bootstrap学习地址

    第一步:https://www.runoob.com/bootstrap/bootstrap-tutorial.html  //菜鸟教程 第二步:https://v3.bootcss.com/gett ...

  10. javascript数据判断是否有指定元素

    jquery方法: $.inArray(dataKey, dataArray) == -1 javascript方法: indexOf() 功能:根据指定的数据,从左向右,查询在数组中出现的位置,如果 ...