题面:

传送门

题目描述:

给出两个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. leetcode 1 两数之和 hashmap

    主要是hashmap.还有边插入边查找,提高效率和降低空间复杂度. 之前一直用map,结果发现还有hashmap,效率更高. 注意名称空间为 using namespace __gnu_cxx; 问题 ...

  2. spring-cloud-netflix-hystrix-dashboard

    Hystrix-dashboard是一款针对Hystrix进行实时监控的工具,通过Hystrix Dashboard我们可以在直观地看到各Hystrix Command的请求响应时间, 请求成功率等数 ...

  3. μC/OS-III---I笔记9---任务等待多个内核对象和任务内建信号量与消息队列

    在一个任务等待多个内核对象在之前,信号量和消息队列的发布过程中都有等待多个内核对象判断的函数,所谓任务等待多个内核对象顾名思义就是一任务同时等待多个内核对象而被挂起,在USOC-III中一个任务等待多 ...

  4. swiper & swiper slider

    swiper & swiper slider mobile swiper https://idangero.us/swiper/ https://idangero.us/swiper/get- ...

  5. 一个模块如何同时支持 ESM 和 CJS

    一个模块如何同时支持 ESM 和 CJS 模块转化 webpack + babel refs xgqfrms 2012-2020 www.cnblogs.com 发布文章使用:只允许注册用户才可以访问 ...

  6. 死磕Spring之IoC篇 - 深入了解Spring IoC(面试题)

    该系列文章是本人在学习 Spring 的过程中总结下来的,里面涉及到相关源码,可能对读者不太友好,请结合我的源码注释 Spring 源码分析 GitHub 地址 进行阅读 Spring 版本:5.1. ...

  7. Dyno-queues 分布式延迟队列 之 生产消费

    Dyno-queues 分布式延迟队列 之 生产消费 目录 Dyno-queues 分布式延迟队列 之 生产消费 0x00 摘要 0x01 前情回顾 1.1 设计目标 1.2 选型思路 0x02 产生 ...

  8. Power Query 导入多源数据

    导入方法: 导入数据库文件: 修改加载方式: 其他类型数据处理方式类似

  9. oracle之用户

    命令都是在命令行窗口执行 创建用户 1)登陆管理员用户 sqlplus system/密码 sqlplus system/briup 注意不要以分号结尾 2)创建用户 create user 用户名 ...

  10. 如何将文件夹取消svn关联

    随便在什么目录新建一个文本文件,文件名随便,将文本文件打开,将下面的文字复制到文本文件中: Windows Registry Editor Version 5.00 [HKEY_LOCAL_MACHI ...