3732. 矩阵复原
#include <algorithm>
#include <bitset>
#include <cassert>
#include <cctype>
#include <cmath>
#include <complex>
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <ctime>
#include <deque>
#include <functional>
#include <iomanip>
#include <iostream>
#include <list>
#include <map>
#include <numeric>
#include <queue>
#include <set>
#include <sstream>
#include <stack>
#include <stdexcept>
#include <string>
#include <vector>
using namespace std;
const int N = 550;
int t;
int n, m;
int a[N][N], b[N][N];
int flag[250000];
int main() {
cin >> t;
while (t--) {
scanf("%d%d", &n, &m);
for (int i = 0; i < n; ++i)
for (int j = 0; j < m; ++j) {
scanf("%d", &a[i][j]);
flag[a[i][j]] = i;
}
for (int i = 0; i < m; ++i)
for (int j = 0; j < n; ++j)
scanf("%d", &b[i][j]);
for (int i = 0; i < n;++i){
int u = flag[b[0][i]];
for (int k = 0; k < m; ++k) {
cout << a[u][k] << ' ';
}
cout << endl;
}
}
return 0;
}
题解:用flag数组记录下每个数字的行号(每个数字只出现一次),然后只需要再读入一行正确的列号,我们就可以通过正确的列号和一列正确的行号去还原整个数组。