公式

A - Make M 解説 by ygussany


\(N = 1\) のときは条件が何も無いので常に可能です. また,入力された数列 \(A\) を自由に並べ替えてよいため,元の順番に意味はありません. 以下では,\(N \ge 3\) とし,あらかじめ入力 \(A\) を昇順にソートしておくと仮定します.

解法の正当性をきちんと証明するのはそれほど簡単ではありませんが,直観的な方法を試すだけで正答を得ることができます. 計算量はソートがボトルネックで \(\mathrm{O}(N \log N)\) です.

解法 1.$~~$貪欲に並べ替える

まず,偶数番目に大きい値,奇数番目に小さい値を置きたいです. したがって,M 型にしようと並べ替えた後の数列 \(B = (B_1, B_2, \dots, B_N)\) について,

\[\{B_1, B_3, \dots, B_N\} = \left\{A_1, A_2, \dots, A_\frac{N+1}{2}\right\}\]

\[\{B_2, B_4, \dots, B_{N-1}\} = \left\{A_\frac{N+3}{2}, A_\frac{N+5}{2}, \dots, A_N\right\}\]

が成り立つとしてよいです. もしそうでなくて M 型になっていれば,そうでない部分がそうなるように偶数番目と奇数番目を適当に入れ替えても M 型のままであることが確認できます.

上記の条件が成り立つように並べ替えると,偶数番目に置かれた値が奇数番目に置かれた値より小さくなることはありません. よって,気にするべきなのは同じ値が隣り合ってしまうことだけです. 同じ値がなるべく隣り合わないようにするためには,大小関係を保って並べるのがよく,\(B_1 \le B_3 \le \cdots \le B_N\) かつ \(B_2 \le B_4 \le \cdots \le B_{N-1}\) が成り立つとしてよいです.(証明は次の解法を参照.) すなわち,

\[B_{2i-1} = A_i \quad \left(i = 1, 2, \dots, \frac{N+1}{2}\right)\]

\[B_{2i} = A_{i+\frac{N+1}{2}} \quad \left(i = 1, 2, \dots, \frac{N-1}{2}\right)\]

を満たすように,さらに言い換えると,

\[B = (B_1, B_2, \dots, B_N) = \left(A_1, A_\frac{N+3}{2}, A_2, A_\frac{N+5}{2}, \dots, A_N, A_\frac{N+1}{2}\right)\]

となるように並べ替えて得られる数列 \(B\) が M 型になっているかどうかを確認すればよいです.

実装例 (C, 56 ms)

解法 2.$~~$基準値の頻度を確認する

\(x = A_\frac{N+3}{2}\)(偶数番目に置きたい最小値)が全体の過半数を占めているかどうかを確認します. 結論としては,\(x\) が過半数を占めていれば不可能で,そうでなければ(解法 1 のように並べることで)可能です.

まず,\(x\) が全体の過半数を占めているときに,M 型になるように並べ替えることは不可能であることを確認します. このとき,M 型に並べ替えようとすると,\(x\) 同士が隣り合う箇所ができないように並べるしかありません. \(x\) は全体の過半数を占めるので,これを満たすためには奇数番目を全て \(x\) にするしかありません. しかしその場合であっても,\(x\) 以下の整数は \(\displaystyle\frac{N+3}{2}\) 個以上あるため,偶数番目に少なくとも \(1\) つは \(x\) 以下の数が置かれることになり,M 型になることはあり得ません.

次に,解法 1 の並べ方で M 型になっていないときに,\(x\) が全体の過半数を占めていることを示します.(対偶を考えると,\(x\) が全体の過半数を占めていなければ,解法 1 の並べ方で M 型にできます.) 解法 1 の並べ方で M 型になっていないとすると,ある偶数 \(k\) に関して \(B_k = B_{k+1}\) が成り立ちます.(もし \(B_k > B_{k+1}\) であれば,\(B_{k-1} < B_{k+1}\) なので \(B_{k-1} < B_k > B_{k+1}\) となって \(k\) に関しては条件を満たしています.) これは元の数列 \(A\) で考えると \(A_{\frac{k}{2} + \frac{N+1}{2}} = A_{\frac{k}{2} + 1}\) が成り立つということであり,

\[A_{\frac{k}{2} + 1} = A_{\frac{k}{2} + 3} = \cdots = A_{\frac{k}{2} + \frac{N+1}{2}}\]

が成り立ちます. \(B_{k+1} = A_{\frac{k}{2} + 1} \) は奇数番目,\(B_k = A_{\frac{k}{2} + \frac{N+1}{2}}\) は偶数番目なので,これは

\[A_{\frac{k}{2} + 1} = A_\frac{N+1}{2} = A_\frac{N+3}{2} = A_{\frac{k}{2} + \frac{N+1}{2}}\]

を意味し,\(x = A_\frac{N+3}{2}\)\(\displaystyle\frac{N+1}{2}\) 個以上ある(すなわち過半数を占めている)ことが示せました.

実装例 (C, 59 ms)

なお,解法 2 は \(\mathrm{O}(N)\) 時間で実行することも可能です.(cf. Median of Medians, Quickselect, Boyer–Moore Majority Vote Algorithm, etc.)

投稿日時:
最終更新: