『题解』CodeForces CF1413B A New Technique
题目大意
有一个 \(n \times m\) 的矩阵,其中的每个数字都不一样。
但我们并不知道这个矩阵长啥样,只知道每一行和每一列的数是哪些,但不知道是哪一行或哪一列的。
请求出这个矩阵。
多组数据。
思路
刚看到题时还有点懵,但发现了 每个数字都不一样 后就秒切了这题。
既然数字都不一样,那就可以在输入行时记录每个数所在的列数,用一个数组 \(a\) 存储。
题目中说数字不大于 \(250000\),所以 \(a\) 要开 \(250005\)。
输入列数时,直接将第 \(j\) 行第 \(a_x\) 列赋值为 \(x\) 即可。
输出答案即可。
代码
#include <iostream>
using namespace std;
int t,n,m,x;
// a 数组用来存储某个数在哪一列
int a[250005],ans[505][505];
// 数据量大,加个快读快写
template<typename T=int>
inline T read(){
T X=0; bool flag=1; char ch=getchar();
while(ch<'0' || ch>'9'){if(ch=='-') flag=0; ch=getchar();}
while(ch>='0' && ch<='9') X=(X<<1)+(X<<3)+ch-'0',ch=getchar();
if(flag) return X;
return ~(X-1);
}
template<typename T=int>
inline void write(T X){
if(X<0) putchar('-'),X=~(X-1);
T s[20],top=0;
while(X) s[++top]=X%10,X/=10;
if(!top) s[++top]=0;
while(top) putchar(s[top--]+'0');
putchar(' ');
}
int main(){
t=read();
while(t--){
n=read(),m=read();
for(int i=1; i<=n; i++){ // 将所有数所在的行数确认
for(int j=1; j<=m; j++){
a[read()]=j; // j 是当前数的列数
}
}
for(int i=1; i<=m; i++){
for(int j=1; j<=n; j++){
x=read();
ans[j][a[x]]=x; // a[x] 是 x 数所在的列数,j 是行数,所以就能确定答案
}
}
for(int i=1; i<=n; i++){
for(int j=1; j<=m; j++){
write(ans[i][j]);
}
puts("");
}
}
return 0;
}

浙公网安备 33010602011771号