QOJ.ac

QOJ

Límite de tiempo: 20 s Límite de memoria: 1024 MB Puntuación total: 27

#11472. 排序排列单元

Estadísticas

你可能听说过 Google 的张量处理单元(Tensor Processing Units),它们被用于构建神经网络。然而,有一个研究领域比机器学习更深奥、更重要:排序!

我们正在研发一种名为“排序置换单元”(Sorting Permutation Unit)的特殊新芯片,它在对整数数组应用置换方面速度极快。形式上,一个置换是对前 $n$ 个正整数的排序: $p_1, p_2, \dots, p_n$ 将其应用于一个包含 $n$ 个整数的数组: $a_1, a_2, \dots, a_n$ 会产生新数组: $a_{p_1}, a_{p_2}, \dots, a_{p_n}$

例如,将置换 $3, 1, 2, 4$ 应用于数组 $99, 234, 45, 800$ 会得到新数组 $45, 99, 234, 800$。

然而,置换在硬件中的表示成本很高,因此该单元最多只能访问 $P$ 个不同的置换。我们需要你帮忙确定这些置换应该是什么!

给定 $K$ 个包含 $N$ 个整数的数组,你必须首先指定最多 $P$ 个你选择的(大小为 $N$ 的)置换。然后,对于这 $K$ 个输入数组中的每一个,你必须提供一个最多包含 $S$ 条指令的序列(每条指令都是你指定集合中的一个置换)。当这些指令按给定顺序应用于数组时,它们必须产生一个非递减排序的数组。在你的 $K$ 个指令序列中,你可以将你的 $P$ 个置换中的每一个使用零次或多次(不一定连续)。

输入格式

输入的第一行给出测试用例的数量 $T$。接下来是 $T$ 个测试用例。每个测试用例的第一行包含四个整数 $P, S, K$ 和 $N$:允许的最大置换数量、允许用于排序每个数组的最大指令数量、数组数量以及每个数组中整数的数量。然后是 $K$ 行,每行包含 $N$ 个整数 $A_{i1}, A_{i2}, \dots, A_{iN}$,其中第 $i$ 行的第 $j$ 个整数 $A_{ij}$ 表示第 $i$ 个数组的第 $j$ 个值。

输出格式

对于每个测试用例,请按以下顺序输出:

  • 一行包含 Case #x:,其中 $x$ 是测试用例编号(从 1 开始)。
  • 一行包含一个整数 $P'$,其中 $1 \le P' \le P$:你选择使用的置换数量。
  • $P'$ 行,第 $i$ 行包含 $N$ 个整数 $p_{i1}, p_{i2}, \dots, p_{iN}$,其中 $p_{ij}$ 是第 $i$ 个置换的第 $j$ 个元素。

然后,输出 $K$ 行。第 $i$ 行给出你将应用于输入中第 $i$ 个数组的指令。每行必须以一个整数 $S'$ 开头,其中 $0 \le S' \le S$,并接续 $S'$ 个整数 $X_1, X_2, \dots, X_{S'}$,其中对于所有 $k$ 均有 $1 \le X_k \le P'$。这里,$X_k$ 表示你应用于第 $i$ 个数组的第 $k$ 条指令是你置换列表中第 $X_k$ 个置换(从 1 开始计数)。这些指令必须使第 $i$ 个输入数组的元素变为非递减排序。

数据范围

时间限制:每个测试集 20 秒。 内存限制:1GB。 $1 \le T \le 10$。 $S = 450$。 $1 \le K \le 30$。 $2 \le N \le 50$。 $1 \le A_{ij} \le 1000$,对于所有 $i$ 和 $j$。

测试集 1(可见): $P = 20$。

测试集 2(隐藏): $P = 5$。

样例

样例输入 1

2
20 450 4 3
10 10 11
17 4 1000
999 998 997
10 10 11
20 450 5 5
1 2 3 4 5
2 3 4 5 1
3 4 5 1 2
4 5 1 2 3
5 1 2 3 4

样例输出 1

Case #1:
2
3 1 2
2 1 3
0
1 2
2 2 1
1 2
Case #2:
1
5 1 2 3 4
0
1 1
2 1 1
3 1 1 1
4 1 1 1 1

说明

在样例 #1 中,我们可以定义最多 $P = 20$ 个置换。一种可行的策略仅使用这两个: 1. $3, 1, 2$ 2. $2, 1, 3$

我们可以按如下方式处理这四个数组: $10, 10, 11$:这已经是非递减排序的,所以我们不需要做任何事情。 $17, 4, 1000$:我们可以应用置换 #2 得到 $4, 17, 1000$。 $999, 998, 997$:一种选择是先应用置换 #2 将数组变为 $998, 999, 997$,然后应用置换 #1 将数组变为 $997, 998, 999$。 $10, 10, 11$:这与第一个数组相同。应用置换 #2 也能得到非递减排序的数组。(但我们也可以像之前那样使用行 0。)

在样例 #2 中,请注意如果需要,我们可以在同一个数组上多次使用相同的置换指令。

Discussions

About Discussions

The discussion section is only for posting: General Discussions (problem-solving strategies, alternative approaches), and Off-topic conversations.

This is NOT for reporting issues! If you want to report bugs or errors, please use the Issues section below.

Open Discussions 0
No discussions in this category.

Issues

About Issues

If you find any issues with the problem (statement, scoring, time/memory limits, test cases, etc.), you may submit an issue here. A problem moderator will review your issue.

Guidelines:

  1. This is not a place to publish discussions, editorials, or requests to debug your code. Issues are only visible to you and problem moderators.
  2. Do not submit duplicated issues.
  3. Issues must be filed in English or Chinese only.
Active Issues 0
No issues in this category.
Closed/Resolved Issues 0
No issues in this category.