AT_tupc2024_d Swap Counter

题目描述

对于 $ (1,2,\dots,M) $ 的一个排列 $ Q=(Q_1,Q_2,\dots,Q_M) $,定义长度为 $ M-1 $ 的序列 $ f(Q) $,规则如下: - 首先将长度为 $ M-1 $ 的序列 $ X $ 初始化为 $ X=(0,0,\dots,0) $。 - 接下来进行 $ M-1 $ 次如下操作: - 按照 $ i=1,2,\dots,M-1 $ 的顺序依次执行下述操作: - 如果 $ Q_i > Q_{i+1} $,则交换 $ Q_i $ 和 $ Q_{i+1} $,并将 $ X_i $ 加 $ 1 $。 - 如果 $ Q_i < Q_{i+1} $,则什么也不做。 - 最终得到的 $ X $ 即为 $ f(Q) $。 现在给定一个长度为 $ N-1 $ 的数列 $ B=(B_1,B_2,\dots,B_{N-1}) $。请判断是否存在一个 $ (1,2,\dots,N) $ 的排列 $ P $,使得 $ f(P)=B $,如果存在则输出字典序最小的满足条件的 $ P $。 有 $ T $ 组测试数据,请分别作答。

输入格式

输入按如下格式从标准输入给出。 > $ T $ > $\text{case}_1$ > $\text{case}_2$ > $\vdots$ > $\text{case}_T$ 每组测试数据格式如下: > $ N $ $ B_1 $ $ B_2 $ $ \dots $ $ B_{N-1} $

输出格式

输出 $ T $ 行,对于每个测试数据,第 $ i $ 行输出一行。如果不存在满足条件的排列,输出 `-1`。否则输出满足条件的字典序最小的 $ P $,用空格隔开。

说明/提示

## 样例解释 1 对于第 $ 1 $ 个测试点,$ P=(3,2,4,1) $ 时 $ f(P) $ 的计算过程如下: - 初始 $ X=(0,0,0) $。 - 第 $ 1 $ 次操作: - $ P_1 > P_2 $,因此 $ X_1 $ 加 $ 1 $,并交换 $ P_1 $ 和 $ P_2 $,得到 - $ X=(1,0,0),P=(2,3,4,1) $。 - $ P_2 < P_3 $,不操作。 - $ P_3 > P_4 $,因此 $ X_3 $ 加 $ 1 $,并交换 $ P_3 $ 和 $ P_4 $,得到 - $ X=(1,0,1),P=(2,3,1,4) $。 - 第 $ 2 $ 次操作: - $ P_1 < P_2 $,不操作。 - $ P_2 > P_3 $,因此 $ X_2 $ 加 $ 1 $,并交换 $ P_2 $ 和 $ P_3 $,得到 - $ X=(1,1,1),P=(2,1,3,4) $。 - $ P_3 < P_4 $,不操作。 - 第 $ 3 $ 次操作: - $ P_1 > P_2 $,因此 $ X_1 $ 加 $ 1 $,并交换 $ P_1 $ 和 $ P_2 $,得到 - $ X=(2,1,1),P=(1,2,3,4) $。 - $ P_2 < P_3 $,不操作。 - $ P_3 < P_4 $,不操作。 最后 $ f(P) = (2,1,1) $。该 $ P $ 也是满足 $ f(P)=B $ 的字典序最小结果。 对于第 $ 2 $ 个测试点, $ f(P)=(2,0,2,4) $ 的排列 $ P $ 不存在。 # 数据范围 - $ 1 \leq T \leq 1.5 \times 10^5 $ - $ 2 \leq N \leq 3 \times 10^5 $ - $ 0 \leq B_i \leq N-1 $ - 所有输入均为整数 - 所有测试数据中 $ N $ 之和不超过 $ 3 \times 10^5 $。 由 ChatGPT 5 翻译