hdu5671 Conturbatio(思维)

来源:互联网 发布:mysql sum group by 编辑:程序博客网 时间:2024/06/06 01:45

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?
 

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.

1n,m,K,Q100,000.

1xn,1ym.

1x1x2n,1y1y2m.
 

Output
For every query output "Yes" or "No" as mentioned above.
 

Sample Input
22 2 1 21 11 1 1 22 1 2 22 2 2 11 11 22 1 2 2
 

Sample Output
YesNoYes
Hint
Huge input, scanf recommended.
 

Source
BestCoder Round #57 (div.2)
 
在一个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,表示询问的矩形的左下角与右上角的坐标。


完全没思路,可能还是因为做题少,定义四个一维数组,两个表示行和列,另外两个表示行或列增加的值,这样就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;} 


0 0
原创粉丝点击