题意: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. C#进阶系列——WebApi 传参详解

    本篇打算通过get.post.put.delete四种请求方式分别谈谈基础类型(包括int/string/datetime等).实体.数组等类型的参数如何传递. 回到顶部 一.get请求 对于取数据, ...

  2. java 线程并发(生产者、消费者模式)

    线程并发协作(生产者/消费者模式) 多线程环境下,我们经常需要多个线程的并发和协作.这个时候,就需要了解一个重要的多线程并发协作模型“生产者/消费者模式”. Ø 什么是生产者? 生产者指的是负责生产数 ...

  3. Java单例最好的设计模式:Spring 之 GlobalAdvisorAdapterRegistry

    先上代码: public abstract class GlobalAdvisorAdapterRegistry { /** * Keep track of a single instance so ...

  4. SVN_03绿色版

    1.首先备份当前安装visualSVN文件的bin目录,万一出错还能反个水.一般默认安装路径是C:\Program Files(x86)VisualSVN\bin 2.然后运行ildasm,Windo ...

  5. ESlint 格式化代码 备忘

    vscode 代码格式化配置 vscode 菜单 文件->首选项->设置 --->进入扩展查找到ESlint,点击任一选项中的[在setting.json中配置],复制以下代码 { ...

  6. js 遍历树的层级关系的实现

    1.遍历树的层级关系 1)先整理数据 2)找到id和数据的映射关系 3)然后找到父节点的数据,进行存储 test() { const list = [ { id: ", parentId: ...

  7. 这些方面做好了才能叫运营-App运营日常

    现在APP的开发推广是时代的潮流,同时也是不少企业的难题.现在我们就来谈谈APP运营的一些问题. 1. 基础运营正常维护产品最日常.最普通的工作,如APP应用包在各大应用市场提交上传等,如安卓渠道,包 ...

  8. Tomcat安装及环境配置

    欢迎任何形式的转载,但请务必注明出处. 本章内容 安装 环境变量入口 三个系统变量配置 测试安装配置是否成功 安装之前请安装jdk并进行环境配置(点击进入jdk教程) 一.安装 点击进入官网下载 二. ...

  9. 微信H5支付(基于Java实现微信H5支付)

    微信的H5支付区别与APP支付,主要在于预下单(返回的参数不一样),其它大体相同(基本没什么区别,区别在于有些人加密喜欢用MD5有些人喜欢用官方提供的加密方式加密,我用的是官方的),贴一下H5支付预下 ...

  10. rabbitmq数据备份与还原

    一.场景 现在有服务器A和服务器B ,由于业务需要,要求把服务器A上mq的数据迁移到服务器B上,rabbitmq的数据包括元数据(RabbitMQ用户.vhost.队列.交换和绑定)和消息数据,而消息 ...