题目大意
题目描述
给定一个正整数 n 以及两个长度为 n 的排列 r 和 c。
请构造一个 n×n 的矩阵,满足以下所有条件:
-
矩阵中的所有元素均为 [0,n] 范围内的整数。
-
矩阵第 i 行元素的 MEX 值为 ri。
-
矩阵第 i 列元素的 MEX 值为 ci。
注:数组的 MEX 值是指数组中未出现的最小非负整数。题目保证必然存在符合上述条件的矩阵。
输入格式
第一行包含一个整数 T(1≤T≤103),表示测试用例的数量。
对于每个测试用例:
第一行包含一个正整数 n(1≤n≤2×103)。
第二行包含一个长度为 n 的排列 r1,r2,…,rn。
第三行包含一个长度为 n 的排列 c1,c2,…,cn。
保证所有测试用例中 n 的总和不超过 2×103。
输出格式
对于每个测试用例,输出 n 行,每行包含 n 个整数,表示满足所有条件的矩阵。如果有多个符合条件的矩阵,输出其中任意一个即可。
样例数据
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
| 输入: 2 4 2 1 3 4 3 4 1 2 5 2 1 4 3 5 1 4 2 5 3
输出: 0 0 4 1 2 3 4 0 1 2 0 1 0 1 2 3 0 0 0 0 1 0 0 0 2 0 2 3 3 1 0 2 1 0 4 2 0 2 1 3 4
|
样例解释
以第一个测试用例为例,n=4,r=[2,1,3,4],c=[3,4,1,2]。
对于输出的矩阵:
-
第 1 行元素为 [0,0,4,1],其中包含 0,1,4,未出现的最小非负整数为 2,等于 r1。
-
第 2 行元素为 [2,3,4,0],其中包含 0,2,3,4,未出现的最小非负整数为 1,等于 r2。
-
第 3 行元素为 [1,2,0,1],其中包含 0,1,2,未出现的最小非负整数为 3,等于 r3。
-
第 4 行元素为 [0,1,2,3],其中包含 0,1,2,3,未出现的最小非负整数为 4,等于 r4。
同理观察列方向上的 MEX 值:
-
第 1 列元素为 [0,2,1,0],包含 0,1,2,其 MEX 值为 3,等于 c1。
-
第 2 列元素为 [0,3,2,1],包含 0,1,2,3,其 MEX 值为 4,等于 c2。
-
第 3 列元素为 [4,4,0,2],包含 0,2,4,其 MEX 值为 1,等于 c3。
-
第 4 列元素为 [1,0,1,3],包含 0,1,3,其 MEX 值为 2,等于 c4。
所有行和列的 MEX 值均完全符合输入的排列要求,该矩阵合法。
思路讲解
不难注意到这样一个构造方法。

然后,其实我们自己也想到了,一个构造方法,可以通过行列交换,得到新的,任何符合要求的这个 mex 矩阵。
通过行交换,可以使得列的条件依然得到满足。通过列交换,可以使得行的条件依然得到满足。
因此,现应用行交换,再应用列交换,就可以把一个这个构造方法变成任何东西。
1 2 3 4 5 6 7 8
| for (int i_R=1;i_R<=N;++i_R) { ll i=R[i_R]; for (int j_C=1;j_C<=N;++j_C) { ll j=C[j_C]; cout<<maze[i][j]<<" "; } cout<<"\n"; }
|
AC代码
AC
https://codeforces.com/gym/106380/submission/366322358
心路历程(WA,TLE,MLE……)