传送门 :Conturbatio
There are many rook on a chessboard, a rook can attack the row and column it belongs, including its own place.
There are also many queries, each query gives a rectangle on the chess board, and asks whether every grid in the rectangle will be attacked by any rook?
InputThe first line of the input is a integer
TT, meaning that there are
TT test cases.
There are also many queries, each query gives a rectangle on the chess board, and asks whether every grid in the rectangle will be attacked by any rook?
Every test cases begin with four integers n,m,K,Qn,m,K,Q.
KK is the number of Rook, QQ is the number of queries.
Then KK lines follow, each contain two integers x,yx,y describing the coordinate of Rook.
Then QQ lines follow, each contain four integers x1,y1,x2,y2x1,y1,x2,y2 describing the left-down and right-up coordinates of query.
1≤n,m,K,Q≤100,0001≤n,m,K,Q≤100,000.
1≤x≤n,1≤y≤m1≤x≤n,1≤y≤m.
1≤x1≤x2≤n,1≤y1≤y2≤m1≤x1≤x2≤n,1≤y1≤y2≤m.
OutputFor every query output "Yes" or "No" as mentioned above.
Sample Input
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 2Sample Output
Yes No Yes
题目大意:棋盘上的一个车可以吃掉同一行同一列的棋子,告诉你 车 的坐标和 一块区域,看看在这块区域中的棋子是不是都会被吃掉
前缀和 ?
树状数组??
代码如下
#include <iostream>
#include <cstdio>
#include <cstring>
#include <cmath>
#include <algorithm>
using namespace std;
const int maxn=100000+10;
int row[maxn],col[maxn];
int main()
{
int t;
scanf("%d",&t);
while(t--)
{
int n,m,k,q;
memset(row,0,sizeof(row));
memset(col,0,sizeof(col));
scanf("%d%d%d%d",&n,&m,&k,&q);
while(k--)
{
int a,b;
scanf("%d%d",&a,&b);
row[a]=1,col[b]=1; //赋值为1 有可能出现相同的不能累加
}
for(int i=1;i<=n;i++)
{
row[i]+=row[i-1];
}
for(int i=1;i<=m;i++)
{
col[i]+=col[i-1];
}
while(q--)
{
int x1,y1,x2,y2,res1,res2;
scanf("%d%d%d%d",&x1,&y1,&x2,&y2);
res1=row[x2]-row[x1-1];
res2=col[y2]-col[y1-1];
if(res1==(x2-x1+1)||res2==(y2-y1+1))
printf("Yes\n");
else
printf("No\n");
}
}
return 0;
}
本文介绍了一个算法问题,即如何判断棋盘上特定区域内的所有格子是否都能被至少一个车所攻击到。通过使用前缀和的方法,文章提供了一种高效的解决方案。
500

被折叠的 条评论
为什么被折叠?



