1136C 构造
给两个正方形矩阵,可以进行子矩阵转置,就是关于子矩阵主对角线元素对称的进行交换,问操作完两个矩阵能否相同
也就是副对角线上元素可以任意交换
看所有副对角线,将每个副对角线元素放到集合里,排序观察是否相等
其中vector排序后可以直接看两个vector是否直接相等,可以优化
for(i=2;i<=n+m;i++)
{
if(pos[i]!=pos1[i])
{
cout << "NO\n";
return ;
}
}
这个题数据较小也可以用multiset,有重集合,数据过大会tle或者mle
multiset也可以直接比较,不用排序了就,但复杂度是一样的
for(int x=2;x<=n+m;++x){
multiset
for(int i=1;i<=n;++i){
int j=x-i;
if(j<1 || j>m)continue;
A.insert(a[i][j]);
B.insert(b[i][j]);
}
if(A!=B){
cout<<"NO\n";
return 0;
}
}
include <bits/stdc++.h>
using namespace std;
define int long long
const int N=5010;
vector
//int a[N];
int dx[]={-1,1,0,0};
int dy[]={0,0,-1,1};
void solve()
{
int n,i,j,m;
cin >> n >> m;
vector<vector
for(i=1;i<=n;i++)
for(j=1;j<=m;j++)
cin >> a[i][j];
for(i=1;i<=n;i++)
for(j=1;j<=m;j++)
cin >> b[i][j];
vector<vector
for(i=1;i<=n;i++)
for(j=1;j<=m;j++)
{
pos[i+j].push_back(a[i][j]);
pos1[i+j].push_back(b[i][j]);
}
for(i=2;i<=n+m;i++)
{
sort(pos[i].begin(),pos[i].end());
sort(pos1[i].begin(),pos1[i].end());
}
for(i=2;i<=n+m;i++)
{
for(j=0;j<pos[i].size();j++)
{
if(pos[i][j]!=pos1[i][j])
{
cout << "NO\n";
return ;
}
}
}
cout << "YES\n";
return ;
}
signed main ()
{
// int t;
//cin >> t;
//while(t--)
solve();
return 0;
}
浙公网安备 33010602011771号