只需要将所有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; }