acwing 3732. 矩阵复原 | 构造
目录
						
							
						
						
						
						
						
					- 题目描述
- 输入格式
 - 输出格式
 - 数据范围
 - 输入样例:
 - 输出样例:
 
 - 分析性质
- 分析
 - 代码
 - 时间复杂度
 
 - 参考文章
 
- 题目描述
 
题目传送门
题目描述
一个 n×mn×m 的整数矩阵,已知其每一行从左到右拥有哪些元素,每一列从上到下拥有哪些元素。
但是,行和列的具体顺序并不确定。
请你根据已知的信息,将矩阵复原并输出。
输入格式
第一行包含整数 TT,表示共有 TT 组测试数据。
每组数据第一行包含两个整数 n,mn,m。
接下来 nn 行,每行包含 mm 个整数,表示其中一行从左到右的所有元素。
接下来 mm 行,每行包含 nn 个整数,表示其中一列从上到下的所有元素。
输出格式
每组数据输出一个 nn 行 mm 列的矩阵。
可以证明一定存在唯一解。
数据范围
1≤T≤1051≤T≤105,
1≤n,m≤5001≤n,m≤500,
一个测试点的所有测试数据的 n×mn×m 之和不超过 250000250000。
矩阵中包含 1~n×m1~n×m 中的每个数恰好一次。
矩阵的每一行和每一列的信息都保证恰好给出一次。输入样例:
2 2 3 6 5 4 1 2 3 1 6 2 5 3 4 3 1 2 3 1 3 1 2输出样例:
1 2 3 6 5 4 3 1 2
分析性质
分析
首先给出了一个矩阵的每一行所有的数字,虽然行的顺序不固定,但是根据这个信息,每一个数在哪一列就可以确定了!!然后题目说了每个数都不一样,所以用一个数组col[x]表示x这个数的列号
然后题目又给了每一列所有的数字,和行类似,虽然列之间的顺序不确定,但是有这个信息就可以确定每一个数的行号
然后就可以将一个数填到对应的行列号中了
代码
#include
#include
using namespace std;
const int N = 510;
int a[N][N];
int ans[N][N];
int col[N*N]; // 每个数字的列号
int t;
int n, m;
int main()
{
	scanf("%d", &t);
	while(t --)
	{
		scanf("%d%d", &n, &m);
		for(int i = 0; i < n; i++)
			for(int j = 0; j < m; j++)
			{
				int x;
				scanf("%d", &x);
				col[x] = j; // 记录x这个数所在的列号 
			}
		
		for(int j = 0; j < m; j++)
			for(int i = 0; i < n; i++)
			{
				int x; 
				scanf("%d", &x);
				ans[i][col[x]] = x;
			 } 
			 
		for(int i = 0; i < n; i ++)
		{
			for(int j = 0; j < m; j++) printf("%d ", ans[i][j]);
			puts("");
		}
	}
	return 0;
	
	
 } 
  
时间复杂度
参考文章
https://www.acwing.com/solution/content/54773/