问题描述
给定整数 \(N, M\),一个包含 \(N\) 个整数的序列 \(X = (X_1, X_2, \dots, X_N)\),以及一个包含 \(M\) 个整数的序列 \(Y = (Y_1, Y_2, \dots, Y_M)\)。
判断是否存在一个 \(N\) 行 \(M\) 列的整数矩阵 \(A = (A_{i,j})\)(其中 \(1 \le i \le N, 1 \le j \le M\)),满足以下所有条件,如果存在,请输出一个这样的矩阵。
条件:
- \(1 \le A_{i,j} \le N \times M\)
- \(A\) 的所有 \(N \times M\) 个元素互不相同。
- 对于每个 \(i = 1, 2, \dots, N\),第 \(i\) 行的最大值等于 \(X_i\)。
- 对于每个 \(j = 1, 2, \dots, M\),第 \(j\) 列的最大值等于 \(Y_j\)。
给定 \(T\) 个测试用例,请解决每个测试用例。
约束条件
- \(1 \le T \le 10^5\)
- \(1 \le N, M\)
- 所有测试用例的 \(N \times M\) 的总和不超过 \(2 \times 10^5\)
- \(1 \le X_i, Y_j \le N \times M\)
- 所有输入值均为整数
输入格式
\(T\)
\(case_1\)
\(case_2\)
\(\dots\)
\(case_T\)
每个测试用例的格式如下:
\(N\) \(M\)
\(X_1\) \(X_2\) \(\dots\) \(X_N\)
\(Y_1\) \(Y_2\) \(\dots\) \(Y_M\)
输出格式
按顺序输出每个测试用例的答案,用换行分隔。
对于每个测试用例,如果不存在满足所有条件的矩阵 \(A\),则输出 "No"。
否则,输出以下格式的矩阵 \(A\):
\(Yes\)
\(A_{1,1}\) \(A_{1,2}\) \(\dots\) \(A_{1,M}\)
\(A_{2,1}\) \(A_{2,2}\) \(\dots\) \(A_{2,M}\)
\(\vdots\)
\(A_{N,1}\) \(A_{N,2}\) \(\dots\) \(A_{N,M}\)
如果有多个满足条件的矩阵 \(A\),输出任意一个均可。
样例输入 1
3
2 3
5 6
5 3 6
3 3
5 4 6
6 2 4
5 4
18 20 19 14 17
18 20 14 15
样例输出 1
Yes
5 1 4
2 3 6
No
Yes
18 12 4 9
13 20 1 10
16 19 6 8
2 5 14 3
11 17 7 15
第一个测试用例的说明
在样例输出中,矩阵 \(A\) 的所有元素都在 1 到 6 之间且互不相同,并且满足:
- 第 1 行的最大值:\(\max\{5, 1, 4\} = 5 = X_1\)
- 第 2 行的最大值:\(\max\{2, 3, 6\} = 6 = X_2\)
- 第 1 列的最大值:\(\max\{5, 2\} = 5 = Y_1\)
- 第 2 列的最大值:\(\max\{1, 3\} = 3 = Y_2\)
- 第 3 列的最大值:\(\max\{4, 6\} = 6 = Y_3\)
因此所有条件都满足。
其他输出(例如以下形式)也是可以接受的:
Yes
5 3 1
4 2 6
如果 \(X\) 中包含重复元素,答案就是 No;\(Y\) 也是同样的道理。我们假设没有这种情况。
考虑按从 \(N \times M\) 到 \(1\) 的降序顺序填充矩阵 \(A\) 的元素。
假设我们已经放置了所有大于 \(v\) 的元素。那么放置 \(v\) 的约束条件如下:
- 如果 \(v\) 同时存在于 \(X\) 和 \(Y\) 中:对于满足 \(X_i = Y_j = v\) 的位置,令 \(A_{i,j} = v\)。
- 如果 \(v\) 仅存在于 \(X\) 中:对于满足 \(X_i = v\) 的行,选择一个满足 \(Y_j > v\) 且 \(A_{i,j}\) 尚未确定的列 \(j\),并令 \(A_{i,j} = v\)。
- 如果 \(v\) 仅存在于 \(Y\) 中:对于满足 \(Y_j = v\) 的列,选择一个满足 \(X_i > v\) 且 \(A_{i,j}\) 尚未确定的行 \(i\),并令 \(A_{i,j} = v\)。
- 如果 \(v\) 既不在 \(X\) 中也不在 \(Y\) 中:选择满足 \(X_i > v\)、\(Y_j > v\) 且 \(A_{i,j}\) 尚未确定的位置 \((i,j)\),并令 \(A_{i,j} = v\)。
由于我们是按降序填充 \(v\) 的,可填充的候选位置数量是单调递增的。因此,只要满足上述规则,我们可以自由地填充这些位置。
剩下的就是将此思路实现为代码,但直接按上述规则检查会导致很高的计算复杂度,从而造成超时(TLE)。在实现时,我们可以认为一旦满足 \(v < \min(X_i, Y_j)\),\(A_{i,j}\) 就可以自由填充,并将满足 \(v = \min(X_i, Y_j)\) 的位置 \((i,j)\) 管理在列表中。更多细节请参考下面的示例代码。