Official

D - Everyone is a winner Editorial by yutaka1999


まず、各 \(1 \leq i \leq N\) について、各参加者が時間がかかる問題から順に問題を解いたとして、 最初に誰かが問題を \(i\) 問解くまでにかかる時間を \(T_i\) 分とします。 このとき、各参加者 \(i\) は、最初の \(i\) 問を \(T_i\) 分以内で解かなければいけません。

以下のようにして各参加者の問題を解く順序を定めると、条件を満たすことが可能かどうか判定することができます。

  • \(i=N,N-1,\ldots,1\) の順に \(i\) を動かし、各 \(i\) に対して以下を行う。
    • 最初の \(i\) 問を \(T_i\) 分以内で解くことができない場合、条件を満たすことはできないと判定し、このアルゴリズムは終了する。
    • そうでない場合、最初の \(i\) 問を解くのにかかる時間が \(T_i\) 以下の範囲でできるだけ大きくなるように、最初の \(i\) 問を定める。 また、最初の \(i\) 問を解くのにかかる時間が同じ場合は、解くのに \(1\) 分かかる問題をできるだけ多く最初の \(i\) 問で解くようにする。
    • そして、最初の \(i\) 問を時間がかかる問題から順に解く。残りの \(N-i\) 問も時間がかかる問題から順に解く。
    • 最後に、参加者 \(i\) が最初の \(j\) 問を解くのにかかる時間を \(t_{i,j}\) として、各 \(1 \leq j < i\) について \(T_j \mapsto \min\{T_j, t_{i,j}\}\) と更新する。
  • すべての参加者について問題を解く順序を定めることができたなら、条件を満たすことは可能であると判定し、このアルゴリズムは終了する。

このアルゴリズムにおいて、\(i<j \leq N\) について \(t_{i,j} \geq T_j\) となることは確認されていません。 しかし、問題を解くのにかかる時間が \(1\) 分、\(2\) 分または \(3\) 分の場合は、この不等式は必ず成立します。 これは、各 \(2 \leq i \leq N\) について、\(i\) に対して操作を行ったとき \(T_{i-1} +2\geq T_i\) であれば、 必ずその時点で \(T_j \leq T_i+2(j-i)\) ( \(j \geq i\) ) となるという性質から従います。 (問題を解く時間が一般の場合は、このような貪欲法ではうまくいきません。)

\(T\) の更新を愚直に行うと計算量は \(O(N^2)\) となってしまいますが、 (不必要な部分を除けば)\(T\) は傾き \(1\), \(2\) または \(3\) の線分からなる凸な折れ線として表せるので、 このアルゴリズムは線形時間で実現することができます。

posted:
last update: