矩阵任意局部转置不变

该博客讨论如何通过局部转置操作将一个矩阵变换为另一个矩阵。重点在于理解如何通过改变2x2子矩阵的对角线元素来实现任意顺序的变换。博主提到了使用map存储负对角线元素集合的方法,并探讨了使用vector处理负对角线以提高效率的方案。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

http://codeforces.com/contest/1136/problem/C 

C. Nastya Is Transposing Matrices

time limit per test

1 second

memory limit per test

256 megabytes

input

standard input

output

standard output

Nastya came to her informatics lesson, and her teacher who is, by the way, a little bit famous here gave her the following task.

Two matrices AA and BB are given, each of them has size n×mn×m. Nastya can perform the following operation to matrix AA unlimited number of times:

  • take any square square submatrix of AA and transpose it (i.e. the element of the submatrix which was in the ii-th row and jj-th column of the submatrix will be in the jj-th row and ii-th column after transposing, and the transposed submatrix itself will keep its place in the matrix AA).

Nastya's task is to check whether it is possible to transform the matrix AA to the matrix BB.

Example of the operation

As it may require a lot of operations, you are asked to answer this question for Nastya.

A square submatrix of matrix MM is a matrix which consist of all elements which comes from one of the rows with indeces x,x+1,…,x+k−1x,x+1,…,x+k−1 of matrix MM and comes from one of the columns with indeces y,y+1,…,y+k−1y,y+1,…,y+k−1 of matrix MM. kk is the size of square submatrix. In other words, square submatrix is the set of elements of source matrix which form a solid square (i.e. without holes).

Input

The first line contains two integers nn and mm separated by space (1≤n,m≤5001≤n,m≤500) — the numbers of rows and columns in AA and BB respectively.

Each of the next nn lines contains mm integers, the jj-th number in the ii-th of these lines denotes the jj-th element of the ii-th row of the matrix AA (1≤Aij≤1091≤Aij≤109).

Each of the next nn lines contains mm integers, the jj-th number in the ii-th of these lines denotes the jj-th element of the ii-th row of the matrix BB (1≤Bij≤1091≤Bij≤109).

Output

Print "YES" (without quotes) if it is possible to transform AA to BB and "NO" (without quotes) otherwise.

You can print each letter in any case (upper or lower).

Examples

input

Copy

2 2
1 1
6 1
1 6
1 1

output

Copy

YES

input

Copy

2 2
4 4
4 5
5 4
4 4

output

Copy

NO

input

Copy

3 3
1 2 3
4 5 6
7 8 9
1 4 7
2 5 6
3 8 9

output

Copy

YES

Note

Consider the third example. The matrix AA initially looks as follows.

 

⎡⎣⎢147258369⎤⎦⎥[123456789]

Then we choose the whole matrix as transposed submatrix and it becomes

 

⎡⎣⎢123456789⎤⎦⎥[147258369]

Then we transpose the submatrix with corners in cells (2,2)(2,2) and (3,3)(3,3).

 

⎡⎣⎢123456789⎤⎦⎥[147258369]

So matrix becomes

 

⎡⎣⎢123458769⎤⎦⎥[147256389]

and it is BB.

所有负对角线的数的集合一样,用map,看了别人的代码,学到了不少, 尤其是对于对角线的处理。怎样证明呢?其实挺简单的,对于任意一个2*2的矩阵,我们可以只交换两个副对角线上的元素。那么这一条对角线上的元素就可以通过这种方式任意变换(像不像冒泡排序?不过是任意排序),所以你可以通过交换使得对角线上的元素转换成任意顺序。

除了用map还能咋搞?用vector存每一负对角线!这个应该是是最快的了。

#include <bits/stdc++.h>
using namespace std;
const int maxn=505;
int a[maxn][maxn],b[maxn][maxn];
map<int,int> Mapa,Mapb;
int main()
{
	int n,m;
	scanf("%d%d",&n,&m);
	for(int i=1;i<=n;i++) for(int j=1;j<=m;j++) scanf("%d",&a[i][j]);
	for(int i=1;i<=n;i++) for(int j=1;j<=m;j++) scanf("%d",&b[i][j]);
	int flag=1;
	for(int i=1;i<=n+m+1;i++){
		Mapa.erase(Mapa.begin(),Mapa.end());
		Mapb.erase(Mapb.begin(),Mapb.end());
		for(int j=1;j<i;j++){
			int k=i-j;
			if(k>m||j>n) continue;
			Mapa[a[j][k]]++;
			Mapb[b[j][k]]++;
		}
		for(auto tp:Mapa){
			if(Mapb[tp.first]!=tp.second){
				printf("NO");
				return 0;
			}
		}
	}
	printf("YES");
	return 0;
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值