题目:点击打开链接
题解:
这道题不能开那么大的二维数组,所以得想个其他办法
可以发现如果一个矩阵被全部攻击到,
很显然要么是因为它的每一行都有车,
或者每一列都有车。
所以只需要记录一下哪些行和哪些列有车
对于每个询问只需要做一个前缀和就可以知道答案了。
#include <iostream>
#include <cstdio>
#include <cstring>
#include <cmath>
using namespace std;
int a[100001],b[100001];
int main()
{
int t;
int n,m,k,q;
int x,y,x1,y1,x2,y2;
scanf("%d",&t);
while(t--)
{
memset(a,0,sizeof(a));
memset(b,0,sizeof(b));
scanf("%d%d%d%d",&n,&m,&k,&q);
while(k--)
{
scanf("%d%d",&x,&y);
a[x]=1;
b[y]=1;
}
for(int i=1;i<=n;i++)
a[i]+=a[i-1];//每一行代表包括自己的前几行的和
for(int j=1;j<=m;j++)
b[j]+=b[j-1];
while(q--)
{
scanf("%d%d%d%d",&x1,&y1,&x2,&y2);
if(a[x2]-a[x1-1]==x2-x1+1||b[y2]-b[y1-1]==y2-y1+1)//只要行全部包括或者列全部包括就可以全部覆盖
printf("Yes\n");
else
printf("No\n");
}
}
return 0;
}