Codeforces 1136C - Nastya Is Transposing Matrices

題目連接:https://codeforces.com/problemset/problem/1136/Cios

 

題意:c++

給出 $n \times m$ 的矩陣 $A,B$,你能夠對其中任意某個 $k \times k$ 的子矩陣進行轉置操做。spa

問你是否能將 $A$ 變成 $B$。code

 

題解:blog

無論咱們如何進行轉置,不難發現整個矩陣的任意一條反對角線上的元素構成的集合,都是不會變的。ci

而咱們能夠進一步得出結論,對於 $A,B$ 兩個矩陣,只要知足任意一條反對角線上的它們的元素構成的集合相同,就能從 $A$ 變成 $B$。get

這也很好證實,由於只要我每次都選取 $2 \times 2$ 的子矩陣進行轉置,必然能將任意一條反對角線上的任意兩個相鄰的元素交換位置,而只要能隨意交換相鄰元素,任意一個序列就能夠變成任意的另外一個序列。it

 

AC代碼:io

#include<bits/stdc++.h>
using namespace std;
const int K=503;
int n,m;
vector<int> a[2*K],b[2*K];
int main()
{
    ios::sync_with_stdio(0);
    cin.tie(0), cout.tie(0);

    cin>>n>>m;
    for(int i=1,x;i<=n;i++) for(int j=1;j<=m;j++) cin>>x, a[i+j].push_back(x);
    for(int i=1,x;i<=n;i++) for(int j=1;j<=m;j++) cin>>x, b[i+j].push_back(x);

    bool ok=1;
    for(int k=2;k<=n+m;k++)
    {
        sort(a[k].begin(),a[k].end());
        sort(b[k].begin(),b[k].end());
        for(int i=0;i<a[k].size();i++) if(a[k][i]!=b[k][i]) ok=0;
    }
    cout<<(ok?"YES":"NO")<<'\n';
}
相關文章
相關標籤/搜索