只需要将所有rook能够覆盖的行和列记录下来,然后按横纵坐标扫描矩形,若行全被覆盖或列全被覆盖输出Yes,若行和列都不能全部覆盖,输出No。用G++提交,不要用C++,否则超时
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <algorithm>
using namespace std;
int r[100010], c[100010]; ///用来记录rook对于行和列的覆盖情况
int sizer = sizeof(r);
int sizec = sizeof(c);
int main()
{
int n, m, K ,Q, T;
int i, j, x, y, x1, x2, y1, y2;
while (~scanf("%d", &T)) {
while (T--) {
memset(r, 0, sizer); ///初始化
memset(c, 0, sizec);
scanf("%d%d%d%d", &n, &m, &K, &Q);
for (i = 0; i < K; i++) {
scanf("%d%d", &x, &y);
r[x] = c[y] = 1; ///标记rook能够覆盖的行和列
}
for (i = 0; i < Q; i++) {
scanf("%d%d%d%d", &x1, &y1, &x2, &y2);
for (j = x1; j <= x2; j++) {
if (!r[j]) break;
}
if (j > x2) {
printf("Yes\n"); ///行全覆盖,直接打印Yes
continue;
}
for (j = y1; j <= y2; j++) {
if (!c[j]) break;
}
if (j > y2) {
printf("Yes\n"); ///此时行不能全被覆盖,但是列能全部覆盖,打印Yes
} else {
printf("No\n"); ///此时行列都不能全被覆盖,打印No
}
}
}
}
return 0;
}