【拾题杂谈】[USACO24OPEN] Farmer John’s Favorite Permutation B
题面:FJ’s Favorite Permutation B
题目描述
Farmer John 有一个长为 $N$($2\le N\le 10^5$)的排列 $p$,包含从 $1$ 到 $N$ 的每个正整数恰好一次。然而,Farmer Nhoj 闯入了 FJ 的牛棚并拆散了 $p$。为了不至于太过残忍,FN 写了一些能够帮助 FJ 重建 $p$ 的提示。当 $p$ 中剩余多于一个元素时,FN 会执行以下操作:
令 $p$ 的剩余元素为 $p_1^\prime,p_2^\prime,\ldots,p_n^\prime$,
- 如果 $p_1^\prime>p_n^\prime$,他写下 $p_2^\prime$ 并从排列中删除 $p_1^\prime$。
- 否则,他写下 $p_{n−1}^\prime$ 并从排列中删除 $p_n^\prime$。
最终,Farmer Nhoj 将按顺序写下 $N−1$ 个整数 $h_1,h_2,\ldots,h_{N−1}$。给定 $h$,Farmer John 希望得到你的帮助重建与 Farmer Nhoj 的提示相一致的最小字典序 $p$,或者判断 Farmer Nhoj 一定犯了错误。我们知道,给定两个排列 $p$ 和 $p^\prime$,如果在第一个两者不同的位置 $i$ 处有 $p_i<p_i^\prime$,则 $p$ 的字典序小于 $p^\prime$。
输入格式
每个测试点包含 $T$ 个独立的测试用例($1\le T\le 10$)。每个测试用例的描述如下:
第一行包含 $N$。
第二行包含 $N−1$ 个整数 $h_1,h_2,\ldots,h_{N−1}$($1\le h_i\le N$)。
输出格式
输出 $T$ 行,每个测试用例一行。
如果存在与 $h$ 相一致的 $1\ldots N$ 的排列 $p$,输出字典顺序最小的 $p$。如果不存在这样的 $p$,输出 $-1$。
样例 #1
样例输入 #1
1 | 5 |
样例输出 #1
1 | 1 2 |
提示
对于第四个测试用例,如果 $p=[3,1,2,4]$ 则 FN 将写下 $h=[2,1,1]$。
1 | p' = [3,1,2,4] |
注意排列 $p=[4,2,1,3]$ 也会产生同样的 $h$,但 $[3,1,2,4]$ 字典序更小。
对于第二个测试用例,不存在与 $h$ 相一致的 $p$;$p=[1,2]$ 和 $p=[2,1]$ 均会产生 $h=[1]$,并非 $h=[2]$。
测试点性质
- 测试点 $2$:$N\le 8$。
- 测试点 $3-6$:$N\le 100$。
- 测试点 $7-11$:没有额外限制。
思路
题目交给我们的生成序列的方式,我们不难注意到一个点,他每次只比较第一个和最后一个的大小,然后把较大的删去。这时候我们就会发现,这是一个排列,也就是说 $1\sim N$ 的数字会且仅会出现一次。那么我们就会发现,这个序列的 $1$ ,会把整个序列的一边硬控,直到只剩下一个数字。
那么我们就不难想到最后一刻,整个序列一定是只会剩下一了。那么最后一次删除前的序列一定是 $[1,x]$ 或者 $[x,1]$ ,这时候,我们就发现题目的第一个性质 $h_{n-1} = 1$ 。如果输入的 $h$ 不满足这个要求,那么是无解的。
那么我们首先就可以确定,至少会有一个数字没有出现,那么这个没有出现的数字,一定是没有被记录就删除了,所以说把它放在边缘是可以的。那么还有一边放什么呢?我们说过一最多出现两次,也就是说,如果一只出现一次,还有一个没出现的数字,刚刚好就是 $n-1$ 个数字,也就是说当一只出现一次的时候,边缘是 1 和一个未出现的数字。那么如果一出现两次呢?那么就说明 $n - 1$ 个数字还有一个是没出现的,这时候也是一样的处理,即当一出现两次的时候,边缘是两个未出现的数字。为什么把未出现的数字安排在边缘呢?因为这两个位置天生不会被记录,这两个位置首先会被排掉一个,另外如果剩下的一边不是一,他还会被小于他的数字排除掉,如果它是一,就会像 $[1,x]$ 或者 $[x,1]$ 这样,被删掉而不被记录。
代码
1 |
|