题意: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. sqlserver 转化函数

    --查询系统当前时间select GETDATE() as date;------------------------- 0-14 ------------------select CONVERT(V ...

  2. sva 基础语法

    断言assertion被放在verilog设计中,方便在仿真时查看异常情况.当异常出现时,断言会报警.一般在数字电路设计中都要加入断言,断言占整个设计的比例应不少于30%.以下是断言的语法: 1. S ...

  3. Windows终端命令行工具Cmder

    在IT这一行,大部分情况下都是推荐大家使用Linux或者类Unix操作系统去编程,Linux作为一代优秀的操作系统,已经人尽皆知,在IT行业已经成为核心.有条件的大佬都选择了使用mac编程,最优秀的莫 ...

  4. ReLU函数的缺陷

    ReLU激活功能并不完美. 它有一个被称为 “ReLU 死区” 的问题:在训练过程中,一些神经元会“死亡”,即它们停止输出 0 以外的任何东西.在某些情况下,你可能会发现你网络的一半神经元已经死亡,特 ...

  5. 用python爬取豆瓣电影Top 250

    首先,打开豆瓣电影Top 250,然后进行网页分析.找到它的Host和User-agent,并保存下来. 然后,我们通过翻页,查看各页面的url,发现规律: 第一页:https://movie.dou ...

  6. bootstrap tab选项卡

    <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title> ...

  7. find 查找文件的命令

    find顾名思义就是查找,Linux下find命令提供相当多的查找条件,可以在众多文件或目录下查找你想要的任何文件或目录. 语法: find filename 我当前目录下有aaa.txt和bbb.t ...

  8. java相关网址汇总2

    分享几个高质量的技术博客和网站. 一.博客 0.酷壳 - COOLSHELL 博客地址是 https://coolshell.cn/. 这个博客的作者是技术圈基本无人不知的技术大牛,江湖人称耗子叔,网 ...

  9. k8s的认证授权

    一.ServiceAccount Service account是为了方便Pod里面的进程调用Kubernetes API或其他外部服务而设计的.它与User account不同   User acc ...

  10. 【二叉搜索树】PAT-天梯赛- L2-004. 这是二叉搜索树吗?

    大致题意: 一棵二叉搜索树可被递归地定义为具有下列性质的二叉树:对于任一结点,    其左子树中所有结点的键值小于该结点的键值:    其右子树中所有结点的键值大于等于该结点的键值:    其左右子树 ...