题意: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. Consul基本使用

    原文: Consul基本使用 date: 2019-05-13 17:01:37 前言 官网介绍Consul是一个分布式服务网格(Service Mesh)解决方案... 而我目前的理解是提供了分布式 ...

  2. Golang高阶:Golang1.5到Golang1.12包管理

    Golang1.5到Golang1.12包管理 1. 前言 Golang 是一门到如今有十年的静态高级语言了,2009年的时候算是正式推出了,然后到最近的一两年,2017-2018年的时候,突然直线上 ...

  3. logback的使用和配置

    参考:https://www.cnblogs.com/warking/p/5710303.html https://www.cnblogs.com 一.logback简介 1.logback: Log ...

  4. 在论坛中出现的比较难的sql问题:46(日期条件出现的奇怪问题)

    原文:在论坛中出现的比较难的sql问题:46(日期条件出现的奇怪问题) 最近,在论坛中,遇到了不少比较难的sql问题,虽然自己都能解决,但发现过几天后,就记不起来了,也忘记解决的方法了. 所以,觉得有 ...

  5. 【转载】如何自己DIY组装一台台式电脑

    针对很多懂计算机的人员来说,有时候都希望自己DIY组装一台台式机,来达到自己的个性化要求以及省钱.其实自己DIY组装一台电脑也很简单,将相应的CPU处理器.主板.内存条.硬盘.固态硬盘.电脑机箱.屏幕 ...

  6. UI5-技术篇-事务Tcode

    1.LPD_CUST 快速启动板概览 2./N/UI2/FLPD_CONF 创建目录与组(全部客户端) 3./N/UI2/FLPD_CUST 创建目录与组(当前客户端) 4./N/UI2/FLP 编辑 ...

  7. Eclipse workspace被锁定

    重新打开Eclipse时,提示如下: Workspace Unavailable: Workspace in use or cannot be created, choose a different ...

  8. python运行出现TypeError: super() takes at least 1 argument (0 given)错误

    在写继承子类的时候出现了TypeError: super() takes at least 1 argument (0 given)的error: 源代码(python3中完美可运行): class ...

  9. javascript_02-变量

    变量 var number = 5; number = 5; //与上面一样的效果,语法没错误,但是不规范 var:关键字,变量的意思. 变量可以立即赋值,也可以稍后赋值. 堆和栈 内存中有两个区域, ...

  10. Flutter——AlertDialog组件、SimpleDialog组件、showModalBottomSheet组件(弹窗组件)

    AlertDialog组件 import 'package:flutter/material.dart'; void main() { runApp(MaterialApp( title: " ...