题面简化
T
T
T 组数据
用
n
n
n 行、
m
m
m 列的不重数字按输入顺序组成一个矩阵
数据范围
1
≤
T
≤
100000
1≤T≤100000
1≤T≤100000
1
≤
n
,
m
≤
500
1≤n,m≤500
1≤n,m≤500
n
m
nm
nm 的总和不超过
250000
250000
250000
思路
一看就是
O
(
T
n
m
)
O(Tnm)
O(Tnm)
只要找到一个数字既在行首又在列首,直接用这列所有数字作索引,然后按先前每行的顺序输出
代码
#include<bits/stdc++.h>
using namespace std;
int T,n,m,_[502][502],f[250004],b,c;
inline int read(){
int x=0,f=1;
char ch=getchar();
while(ch<'0'||ch>'9') ch=getchar();
while(ch>='0'&&ch<='9'){
x=(x<<1)+(x<<3)+(ch^48);
ch=getchar();
}
return x*f;
}
int main(){
scanf("%d",&T);
for(int i=0;i<T;i++){
n=read();
m=read();
for(int j=1;j<=n;j++){
for(int k=1;k<=m;k++) _[j][k]=read();
f[_[j][1]]=j;
}
for(int j=1;j<=m;j++){
b=read();
if(f[b]){
for(int l=1;l<=m;l++) printf("%d ",_[f[b]][l]);
printf("\n");
f[b]=0;
for(int k=2;k<=n;k++){
b=read();
for(int l=1;l<=m;l++) printf("%d ",_[f[b]][l]);
printf("\n");
f[b]=0;
}
}
else for(int k=2;k<=n;k++) c=read();
}
}
return 0;
}