Conturbatio
Accepts: 206
Submissions: 703
Time Limit: 6000/3000 MS (Java/Others)
Memory Limit: 65536/65536 K (Java/Others)
问题描述
在一个n×m的国际象棋棋盘上有很多车(Rook),其中车可以攻击他所属的一行或一列,包括它自己所在的位置。
现在还有很多询问,每次询问给定一个棋盘内部的矩形,问矩形内部的所有格子是否都被车攻击到?
输入描述
输入文件包含多组数据,第一行为数据组数T。 每组数据有4个正整数n,m,K,Q。 K为车的数量,Q为询问的个数。 接下来有K行,每行两个整数x,y , 表示车所在的坐标。 再接下来有Q行,每行4个整数x1,y1,x2,y2,表示询问的矩形的左下角与右上角的坐标。 1≤n,m,K,Q≤100,000. 1≤x≤n,1≤y≤m. 1≤x1≤x2≤n,1≤y1≤y2≤m.
输出描述
对于每组询问,输出Yes或No。
输入样例
2 2 2 1 2 1 1 1 1 1 2 2 1 2 2 2 2 2 1 1 1 1 2 2 1 2 2
输出样例
Yes No Yes
Hint
输入数据过大,建议使用scanf
出题人:可以发现如果一个矩阵被全部攻击到,很显然要么是因为它的每一行都有车,
或者每一列都有车。所以只需要记录一下哪些行和哪些列有车,对于每个询问只需要
做一个前缀和就可以知道答案了。
#include
#include
#include
using namespace std;
const int N=100005;
int xx[N],yy[N];
int main()
{
int T;
scanf("%d",&T);
while(T--)
{
memset(xx,0,sizeof(xx));
memset(yy,0,sizeof(yy));
int n,m,k,q,i,x,y,x1,y1,maxn=0,mixn=N;
scanf("%d%d%d%d",&n,&m,&k,&q);
for(i=0; i