『题解』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;
}
posted @ 2022-03-10 19:27  仙山有茗  阅读(33)  评论(0)    收藏  举报