CF2273F Pancho's Permutation

题目描述

Pancho 小时候收到了一份礼物,是一个排列 $p_1, p_2, \ldots, p_n$。他与这个排列共同度过了美好的时光,但在他 18 岁生日时,惊恐地发现排列中的部分元素可能被抹去了。 Pancho 一直不擅长记长数字序列,但他记得这个排列有以下两个性质: - 对任意 $i$($1 \le i \le n-1$),$p_1, p_2, \ldots, p_i$ 不是长度为 $i$ 的一个排列。 - 对任意 $j$($2 \le j \le n$),$p_j, p_{j+1}, \ldots, p_n$ 不是长度为 $n-j+1$ 的一个排列。 你的任务是帮 Pancho 输出按字典序排序后的第 $k$ 小个满足上述条件的排列,或者报告不存在这样的排列。 一个长度为 $n$ 的排列是由 $1$ 到 $n$ 的不同整数按任意顺序组成的数组。例如,$[2,3,1,5,4]$ 是一个排列,但 $[1,2,2]$ ($2$ 出现两次)和 $[1,3,4]$(长度为 $3$,但包含 $4$)都不是排列。 数组 $a$ 在字典序上小于数组 $b$,当且仅当以下两种情况之一成立: - $a$ 是 $b$ 的前缀,且 $a \neq b$; - 在第一个不同的位置,$a$ 的元素小于 $b$ 上的对应元素。

输入格式

每个测试包含多个测试用例。第一行包含测试用例数 $t$($1 \leq t \leq 100$)。接下来是每个测试用例的描述。 每个测试用例的第一行包含两个整数 $n$ 和 $k$($2 \leq n \leq 10^6$,$1 \leq k \leq 10^{18}$),表示排列的长度和你需要构造的第 $k$ 个答案的字典序编号。 第二行包含 $n$ 个整数 $p_1, p_2, \dots, p_n$(若 $p_i$ 已知,则 $1 \leq p_i \leq n$;否则 $p_i = -1$),即关于原排列的已知信息。 保证所有已知的 $p_i$(即 $p_i \neq -1$)两两不同。 保证所有测试用例中 $n$ 的总和不超过 $10^6$。

输出格式

每个测试用例输出一行。如果满足条件的排列数小于 $k$,输出 $-1$;否则输出 $n$ 个整数,即所要求的排列。

说明/提示

第一个样例中,前两个已知元素为 $1,2$。由于这两个数正好组成一个长度为 $2$ 的排列,因此没有满足条件的排列。 第三个样例中,恰好有 $2$ 个有效排列(按字典序排序分别为 $[2, 4, 1, 3]$ 和 $[3, 1, 4, 2]$)。 答案即为要求的第二个排列。 由 ChatGPT 5 翻译