Conturbatio
Time Limit: 6000/3000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others)
Total Submission(s): 975 Accepted Submission(s): 439
Problem Description
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?
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?
Input
The first line of the input is a integer
T
, meaning that there are
T
test cases.
Every test cases begin with four integers n,m,K,Q .
K is the number of Rook, Q is the number of queries.
Then K lines follow, each contain two integers x,y describing the coordinate of Rook.
Then Q lines follow, each contain four integers x1,y1,x2,y2 describing the left-down and right-up coordinates of query.
1≤n,m,K,Q≤100,000 .
1≤x≤n,1≤y≤m .
1≤x1≤x2≤n,1≤y1≤y2≤m .
Every test cases begin with four integers n,m,K,Q .
K is the number of Rook, Q is the number of queries.
Then K lines follow, each contain two integers x,y describing the coordinate of Rook.
Then Q lines follow, each contain four integers x1,y1,x2,y2 describing the left-down and right-up coordinates of query.
1≤n,m,K,Q≤100,000 .
1≤x≤n,1≤y≤m .
1≤x1≤x2≤n,1≤y1≤y2≤m .
Output
For 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 2
Sample Output
Yes No YesHintHuge input, scanf recommended.
Source
在一个n \times mn×m的国际象棋棋盘上有很多车(Rook),其中车可以攻击他所属的一行或一列,包括它自己所在的位置。
现在还有很多询问,每次询问给定一个棋盘内部的矩形,问矩形内部的所有格子是否都被车攻击到?
输入描述
输入文件包含多组数据,第一行为数据组数TT。
每组数据有4个正整数n , m , K , Qn,m,K,Q。
KK为车的数量,QQ为询问的个数。
接下来有KK行,每行两个整数x , yx,y , 表示车所在的坐标。
再接下来有QQ行,每行4个整数x1 , y1 , x2 , y2x1,y1,x2,y2,表示询问的矩形的左下角与右上角的坐标。
现在还有很多询问,每次询问给定一个棋盘内部的矩形,问矩形内部的所有格子是否都被车攻击到?
输入描述
输入文件包含多组数据,第一行为数据组数TT。
每组数据有4个正整数n , m , K , Qn,m,K,Q。
KK为车的数量,QQ为询问的个数。
接下来有KK行,每行两个整数x , yx,y , 表示车所在的坐标。
再接下来有QQ行,每行4个整数x1 , y1 , x2 , y2x1,y1,x2,y2,表示询问的矩形的左下角与右上角的坐标。
完全没思路,可能还是因为做题少,定义四个一维数组,两个表示行和列,另外两个表示行或列增加的值,这样就ok了,感觉很神奇啊。
#include<cstdio>
#include<algorithm>
#include<cstring>
#define N 1005
#define mem(a,b) memset(a,b,sizeof(a))
using namespace std;
int map[N][N],a[N],b[N],c[N],d[N];
int main()
{
int t;
scanf("%d",&t);
while(t--)
{
mem(a,0); mem(b,0);
mem(c,0); mem(d,0);
int n,m,q;
scanf("%d%d%d",&n,&m,&q);
for(int i=1;i<=n;i++)
{
a[i]=i;
for(int j=1;j<=m;j++)
{
b[j]=j;
scanf("%d",&map[i][j]);
}
}
while(q--)
{
int u,x,y;
scanf("%d%d%d",&u,&x,&y);
if(u==1)
swap(a[x],a[y]);
else if(u==2)
swap(b[x],b[y]);
else if(u==3)
c[a[x]]+=y;//这一行所要增加的值
else d[b[x]]+=y;
}
for(int i=1;i<=n;i++)
{
for(int j=1;j<=m;j++)
{
if(j!=m) printf("%d ",map[a[i]][b[j]]+c[a[i]]+d[b[j]]);//因为位置发生交换了,所以为map[a[i]][b[j]]
else printf("%d\n",map[a[i]][b[j]]+c[a[i]]+d[b[j]]);
}
}
}
return 0;
}