题面:

传送门

题目描述:

给出两个n x m的矩阵A,B。矩阵A可以把正方子矩阵进行“转置操作”,问:可不可以对矩阵A进行多次这样的操作,使矩阵A变为矩阵B?
 

题目分析:

这道题是一道水题,但是我一时脑子瓦特了,看了题解也有点懵,看了代码才突然想明白的,所以特地来写一下博客。
 
首先,我们可以发现:
矩阵里面的一个元素可以通过多次转置转移到其他地方,其他的对应元素也会相应发生变化。所以,这个变换过程会很复杂。如果直接去暴力模拟的话,矩阵里面有500*500个元素,遍历一遍就要1e5的时间了,暴力是肯定不行的。这时,我们仍分析变化的东西会变得更为复杂,所以关键是找不变的东西,那怎么找呢?可以看一下样例:由于样例1,2太简单了,我们就不去分析它们。我们看看样例3:
这里我们很容易发现:变化之后的数字要么就是原来的位置,要么就是关于主对角线对称的位置。那是不是巧合呢?的确是巧合,我们可以找出这样的反例:当矩阵A不变,矩阵B为这样时:
1  4  5
2  7  6
3  8  9
其实这个矩阵B就是上右方的那个矩阵B的2*2子矩阵转置一下,但这个转置后的矩阵B显然不符合刚刚我们推出的规律。
所以我们要继续思考:
既然是要在变化中找不变的规律,我们肯定要找变化的元素,然后看它们的属性,找出不变量,拿上述矩阵的数字7作为例子看看:
在矩阵A中,他的位置是第3行,第1列。而在新的矩阵B中,7的位置在第2行,第2列。我们发现了:3+1 == 2+2
这似乎就是我们要找的答案了:转置后,元素的行列之和不变。那为什么会这样呢?我们进一步的想:在转置的过程中,我们是通过主对角线来进行转置的,示意图(红色的块转置后变成绿色的块):
再进一步,是这样进行转置的:
我们沿着反对角线,从红色的方块走到绿色的方块:
先从红色的方块走到黄色的方块:行-1,列+1
同理,走到绿色的方块时:行-3,列+3,刚刚好行列增量抵消掉了。
即:所有元素都可以沿着的反对角线走,从而使自己的行列之和不变。
所以,要判断矩阵A是否能变成矩阵B,只需要判断:行列之和相同时,两个矩阵包含的元素相同就可以了(这里有多种写法,能达到这个目的就可以了)。
 
 
AC代码(vector版本):
 1 #include <stdio.h>
2 #include <vector>
3 #include <algorithm>
4 using namespace std;
5 int n, m, A, B;
6 vector<int> a[1005], b[1005];
7
8 int main(){
9 scanf("%d%d", &n, &m);
10 for(int i = 0; i < n; i++){
11 for(int j = 0; j < m; j++){
12 scanf("%d", &A);
13 a[i+j].push_back(A); //将行列之和相同的元素加入到同一组
14 }
15 }
16 for(int i = 0; i < n; i++){
17 for(int j = 0; j < m; j++){
18 scanf("%d", &B);
19 b[i+j].push_back(B);
20 }
21 }
22
23 for(int i = 0; i < n+m; i++){
24 //排序,方便下面判断
25 sort(a[i].begin(), a[i].end());
26 sort(b[i].begin(), b[i].end());
27
28 if(a[i] != b[i]){ //判断:行列之和相同时,两个矩阵包含的元素是否相同
29 printf("NO\n");
30 return 0;
31 }
32 }
33 printf("YES\n");
34 return 0;
35 }
 
 
 
 
 

Codeforces Round #546 C. Nastya Is Transposing Matrices的更多相关文章

  1. Codeforces Round #546 (Div. 2) C. Nastya Is Transposing Matrices

    C. Nastya Is Transposing Matrices time limit per test 1 second memory limit per test 256 megabytes i ...

  2. Codeforces Round #546 (Div. 2) 题解

    Codeforces Round #546 (Div. 2) 题目链接:https://codeforces.com/contest/1136 A. Nastya Is Reading a Book ...

  3. Codeforces 1136C - Nastya Is Transposing Matrices

    题目链接:https://codeforces.com/problemset/problem/1136/C 题意: 给出 $n \times m$ 的矩阵 $A,B$,你可以对其中任意某个 $k \t ...

  4. Codeforces Round #546 (Div. 2) B. Nastya Is Playing Computer Games

    链接:https://codeforces.com/contest/1136/problem/B 题意: 有n个井盖,每个井盖上有一个小石头. 给出n和k,k表示刚开始在第k个井盖上方. 有三种操作, ...

  5. Codeforces Round #546 (Div. 2) A. Nastya Is Reading a Book

    链接:https://codeforces.com/contest/1136/problem/A 题意: 给n个区间,每个区间范围不超过100,n不超过100. 给一个位置k,1-(k-1)是遍历过的 ...

  6. Codeforces Round #546 (Div. 2)-D - Nastya Is Buying Lunch

    这道题,神仙贪心题... 题意就是我给出数的顺序,并给出多个交换,每个只能用于相邻交换,问最后一个元素,最多能往前交换多少步. 我们考虑这样一个问题,如果一个这数和a[n]发生交换,那么这个数作为后面 ...

  7. codeforces#1136 C. Nastya Is Transposing Matrices(找规律)

    题意:给出两个n*m的矩阵,每次操作可以让一个正方形矩阵行列交换.问,在无限次操作下,第一个矩阵能否变成第二个矩阵 分析:先把操作限定在2*2的矩阵中.这样对角线上的元素就可以随意交换.也就是说,如果 ...

  8. Codeforces Round #546 (Div. 2) E - Nastya Hasn't Written a Legend

    这题是一个贼搞人的线段树 线段树维护的是 区间和a[i - j] 首先对于update的位置可以二分查找 其次update时候的lazy比较技巧 比如更新的是 l-r段,增加的是c 那么这段的值为: ...

  9. Nastya Hasn't Written a Legend(Codeforces Round #546 (Div. 2)E+线段树)

    题目链接 传送门 题面 题意 给你一个\(a\)数组和一个\(k\)数组,进行\(q\)次操作,操作分为两种: 将\(a_i\)增加\(x\),此时如果\(a_{i+1}<a_i+k_i\),那 ...

随机推荐

  1. codeforces 1042D - Petya and Array【树状数组+离散化】

    题目:戳这里 题意:有n个数,问有多少个区间满足[L,R]内的和小于t. 解题思路: [L,R]内的和小于t等价于sum[R]-sum[L-1]<t,将sum[L-1]左移,可以看出R与L的关系 ...

  2. codeforces 1C (非原创)

    C. Ancient Berland Circus time limit per test 2 seconds memory limit per test 64 megabytes input sta ...

  3. 2019牛客多校第二场F Partition problem(暴搜)题解

    题意:把2n个人分成相同两组,分完之后的价值是val(i, j),其中i属于组1, j属于组2,已知val表,n <= 14 思路:直接dfs暴力分组,新加的价值为当前新加的人与不同组所有人的价 ...

  4. TypeScript 4.1 Quick Start Tutorials

    TypeScript 4.1 Quick Start Tutorials TypeScript 4.1 快速上手教程 https://typescript-41-quick-start-tutoria ...

  5. shit LeetCode interview Question

    shit LeetCode interview Question https://leetcode.com/interview/1/ 有点晕,啥意思,没太明白,到底是要按什么排序呀? 去掉 标识符 不 ...

  6. github & coding 2018

    github & coding 2018 github & coding all in one https://github.com/topics/javascript react r ...

  7. blogs & cnblogs

    blogs & cnblogs https://www.cnblogs.com/xgqfrms https://i.cnblogs.com/diaries https://i.cnblogs. ...

  8. CSS animation & CSS animation 101

    CSS animation 101 如何为 Web 添加动画效果. https://github.com/cssanimation/css-animation-101 https://github.c ...

  9. Flatten Arrays & flat() & flatMap()

    Flatten Arrays & flat() & flatMap() https://alligator.io/js/flat-flatmap/ "use strict&q ...

  10. React & CSS Modules & CSS in JS

    React & CSS Modules & CSS in JS https://codesandbox.io/s/css-modules-name-mangling-ck1eo CSS ...