hdu5671 Conturbatio(思维)

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
  
  
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 Yes
Hint
Huge 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,表示询问的矩形的左下角与右上角的坐标。


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


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值