CF1375D Replace by MEX
题目描述
给你一个长度为 $n$ 的整数数组,数组中的元素取值范围为 $0$ 到 $n$(包含 $0$ 和 $n$)。
每次操作,你可以选择数组中的任意一个元素,并将其替换为当前数组的 MEX(即当前数组中未出现的最小非负整数,注意操作后 MEX 可能会发生变化)。
例如,如果当前数组为 $[0, 2, 2, 1, 4]$,你可以选择第二个元素并将其替换为当前数组的 MEX——$3$。此时数组变为 $[0, 3, 2, 1, 4]$。
你需要在不超过 $2n$ 次操作内,将数组变为非递减数组。
可以证明一定存在解。请注意,你不需要使操作次数最少。如果有多种方案,你可以输出任意一种。
—
一个数组 $b[1 \ldots n]$ 是非递减的,当且仅当 $b_1 \le b_2 \le \ldots \le b_n$。
数组的 MEX(minimum excluded)是指不属于该数组的最小非负整数。例如:
- $[2, 2, 1]$ 的 MEX 是 $0$,因为 $0$ 不在数组中。
- $[3, 1, 0, 1]$ 的 MEX 是 $2$,因为 $0$ 和 $1$ 在数组中,但 $2$ 不在。
- $[0, 3, 1, 2]$ 的 MEX 是 $4$,因为 $0$、$1$、$2$ 和 $3$ 都在数组中,但 $4$ 不在。
需要注意的是,长度为 $n$ 的数组的 MEX 一定在 $0$ 到 $n$ 之间(包含 $0$ 和 $n$)。
输入格式
第一行包含一个整数 $t$($1 \le t \le 200$),表示测试用例的数量。接下来是每个测试用例的描述。
每个测试用例的第一行包含一个整数 $n$($3 \le n \le 1000$),表示数组的长度。
第二行包含 $n$ 个整数 $a_1, \ldots, a_n$($0 \le a_i \le n$),表示数组的元素。注意这些元素不一定互不相同。
保证所有测试用例中 $n$ 的总和不超过 $1000$。
输出格式
对于每个测试用例,输出两行:
第一行输出一个整数 $k$($0 \le k \le 2n$),表示你执行的操作次数。
第二行输出 $k$ 个整数 $x_1, \ldots, x_k$($1 \le x_i \le n$),其中 $x_i$ 表示第 $i$ 次操作选择的数组下标。
如果有多种方案,你可以输出任意一种。请注意不要求 $k$ 最小。
说明/提示
第一组样例中,数组已经是非递减的($2 \le 2 \le 3$)。
第二组样例解释(每次操作修改的元素用红色标出):
- $a = [2, 1, 0]$,初始 MEX 为 $3$。
- $a = [2, 1, {\color{red}{3}}]$,新的 MEX 为 $0$。
- $a = [{\color{red}{0}}, 1, 3]$,新的 MEX 为 $2$。
- 最终数组为非递减:$0 \le 1 \le 3$。
第三组样例解释:
- $a = [0, 7, 3, 1, 3, 7, 7]$,初始 MEX 为 $2$。
- $a = [0, {\color{red}{2}}, 3, 1, 3, 7, 7]$,新的 MEX 为 $4$。
- $a = [0, 2, 3, 1, {\color{red}{4}}, 7, 7]$,新的 MEX 为 $5$。
- $a = [0, 2, 3, 1, {\color{red}{5}}, 7, 7]$,新的 MEX 为 $4$。
- $a = [0, 2, 3, {\color{red}{4}}, 5, 7, 7]$,新的 MEX 为 $1$。
- 最终数组为非递减:$0 \le 2 \le 3 \le 4 \le 5 \le 7 \le 7$。
由 ChatGPT 4.1 翻译