公式

C - Grip 解説 by Cyanmond


(本質的に同じですが) 方針が大きく異なる解法を \(2\) つ紹介します。似たような解法は他にもあるでしょう。

解法 \(1\)

\(A_i \neq -1\) かつ \(A_i < A_1\) である \(i\) の個数を \(a\)\(A_i \neq -1\) かつ \(A_i > A_1\) である \(i\) の個数を \(b\) とします。

\(a < N\)\(b < N\) を共に満たせば目標の達成が可能で、そうでなければ不可能です。計算量は \(Θ(N)\) です。提出コード (C++)

解法 \(2\)

\(A_i = -1\) である \(A_i\) を全て \(A_1\) に書き換えます。

(重複を別々に数えて) 小さい方から \(N-1\) 番目の要素が \(A_1\) と等しければ目標の達成が可能、そうでなければ不可能です。ソートアルゴリズムを利用すると計算量は \(O(N \log N)\) で、上の解法より劣りますが十分高速です。提出コード (C++)

なお、数列中の \(k\) 番目に小さい値を求めるアルゴリズムは選択アルゴリズムと呼ばれ、数列長を \(n\) として計算量 \(O(n)\) で動作するアルゴリズムの存在が知られています。

投稿日時:
最終更新: