ARC227 B - Know Your Place

各自の場所

考え方

仮に $B$ が構成できたとして、値 $i$ がどこに入れられるか考えてみる。
以下、順番は 0-indexed で表記する。

まず、条件を満たしている以上、$i$ 番目より前は全て $i$ 未満の数。
よって、$i$ 番目以後、次に $i$ 未満の値が初めて登場する前まで。
これが、値 $i$ を使用できる範囲である。

ということは、$i$ 番目は「それまでに未使用な $i$ 以下の数で最大のもの」でよい。

カウンティングソートと stack を利用すれば、計算量は $O(N)$ となる。

入力例1での動作

入力を受け取る。

n: 4
a: {3, 0, 1, 0}

各値の個数は、$0$ が $2$ 個、$1$ が $1$ 個、$2$ が $0$ 個、$3$ が $1$ 個である。

$i=0$ では、使用できる値として $0$ が $2$ 個ある。
最大の $0$ を採用し、残りは $0$ が $1$ 個となる。

$i=1$ では、値 $1$ も使用できるようになる。
使用できる未使用の値は $0,1$ なので、最大の $1$ を採用する。

$i=2$ では、新たに使用できる値 $2$ はない。
残っている値 $0$ を採用する。

$i=3$ では、値 $3$ が使用できるようになる。
これを採用する。

したがって、構築される数列は次のようになる。

b: {0, 1, 0, 3}

最後まで構築できたので、Yes とこの数列を出力する。

注意点

特になし。

別解

特になし。