Kazun の競プロ記録

競技プログラミングに関する様々な話題を執筆します.

AtCoder Beginner Contest 301 B問題 Fill the Gaps

問題

atcoder.jp

提出解答

atcoder.jp

問題の概要

長さ  N の整数列  A=(A_1, \dots, A_N) がある. ここで, 隣り合う項は全て異なることが証明できる.

このとき,  A に対して, 以下の操作を行う.

  1.  A の隣り合う項の差の絶対値が  1 である場合は操作を終了する.
  2.  A において, 隣り合う項の差の絶対値が  1 でない最初の箇所を  A_i, A_{i+1} とする.
    •  A_i \lt A_{i+1} ならば,  A_i, A_{i+1} の間に  A_i+1, A_i+2, \dots, A_{i+1}-1 を挿入する.
    •  A_i \gt A_{i+1} ならば,  A_i, A_{i+1} の間に  A_i-1, A_i-2, \dots, A_{i+1}+1 を挿入する.

操作後の  A を求めよ.

制約

  •  1 \leq N \leq 100.
  •  1 \leq A_i \leq 100.
  •  A_i \neq A_{i+1}.

解法

次のようにして操作後の  A を求めることができる.

  •  B を空列とする.
  •  B A_1 を挿入する.
  •  i=1,2, \dots, N-1 に対して, 以下を行う.
    •  A_i \lt A_{i+1} ならば,  B の末尾に  (A_i+1, A_i+2, \dots, A_{i+1}-1) を挿入する.
    •  A_i \gt A_{i+1} ならば,  B の末尾に  (A_i-1, A_i-2, \dots, A_{i+1}+1) を挿入する.
  •  B が答え.