Kevinrzy103874的博客

Kevinrzy103874的博客

动态线条
动态线条end
code: {

专注于分享信息学竞赛技巧、知识点、模拟赛及一些题目题解,又有着当码农的乐趣,有时还会写写比赛游记等等。

模拟赛Atcoder Beginner Contest 433官方题解(E题)

问题描述

给定整数 \(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. \(1 \le A_{i,j} \le N \times M\)
  2. \(A\) 的所有 \(N \times M\) 个元素互不相同。
  3. 对于每个 \(i = 1, 2, \dots, N\),第 \(i\) 行的最大值等于 \(X_i\)
  4. 对于每个 \(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)\) 管理在列表中。更多细节请参考下面的示例代码。

posted @ 2025-11-24 13:32  Kevinrzy103874  阅读(7)  评论(0)    收藏  举报