Official

J - Merge and Decrement Editorial by enjapma


まず、操作 \(1\) は最初に行うとして良いです。なぜなら、操作 \(2\) を行なった後の要素に対して操作 \(1\) を行うことを考えると、操作 \(2\) を行う前の \(2\) つの要素のうち小さくない方に先に操作 \(1\) を適用しても、操作 \(2\) の適用は可能だからです。

ここで、操作を逆順に捉えましょう。すると、問題は以下のようになります。

操作 : \(B_i\)\(\left\lfloor \frac{B_i}{2} \right\rfloor\)\(\left\lceil \frac{B_i}{2} \right\rceil\) に置き換える。

問題 : 操作を \(N - M\) 回行った後、\(A\)\(B\) を昇順に並び替えて、全ての \(i\) について \(A_i \ge B_i\) と出来るか?

これは、以下のようなアルゴリズムにより判定できます。

まず、\(B\) の最大値が \(A\) の最大値より大きい場合、\(B\) の最大値に対して操作を行うしかありません。

次に、\(B\) の最大値が \(A\) の最大値以下の場合、この場合はこの \(2\) つの要素をそれぞれ対応させることにして、\(A\)\(B\) からそれぞれ最大値を削除して構いません。(ただし、\(B\) が単一の要素からなる場合は例外で、この要素に操作を適用する必要があります。)

証明ですが、まず \(B\) の最大値を別の要素と対応させても得をしません。なぜなら、 \(B\) の最大値と対応がつく \(A\) の要素は全て \(B\) の最大値以上であり、本質的には全て同じ要素だからです。

次に、「\(B\) の最大値に操作を適用する」→「\(B\) の最大値と \(A\) の最大値を対応させる」の操作列は、順序を逆にする、つまり「\(B\) の最大値と \(A\) の最大値を対応させる」→「\(B\) の最大値に操作を適用する」にしたほうが、操作後の \(B\) の値の集合は真に小さくなり、損をしません。

posted:
last update: