公式

C - Solve with Friends 解説 by number_cat


解く問題数を固定してなむか君が \(k\) 問、なぷか君が \(N-k\) 問を解くとしたとき、なむか君は \(A_i-B_i\) が小さい \(k\) 問を、なぷか君は \(A_i-B_i\) が大きい \(N-k\) 問を解くと時間の総和は最小になります。

証明 なむか君が解く問題 \(i\) となぷか君が解く問題 \(j\) であって \(A_i-B_i>A_j-B_j\) を満たすものが存在すると仮定します。このとき、解く問題を交換してなむか君が問題 \(j\) を、なぷか君が問題 \(i\) を解くことにすると、 \((A_i+B_j)-(A_j+B_i)=(A_i-B_i)-(A_j-B_j)>0\) であるため時間の総和は小さくなり、最小性に矛盾します。

よって、なむか君が解く問題 \(i\) となぷか君が解く問題 \(j\) はすべて \(A_i-B_i\le A_j-B_j\) を満たし、示されました。

答えは変わらないので、 \((A_i,B_i)\)\(A_i-B_i\) で昇順にソートします。

すると \(k\) を固定したときの時間の総和の最小値は \(\sum_{i=1}^{k} A_i+\sum_{i=k+1}^{N} B_i+\sum_{i=0}^{k-1} C_i+\sum_{i=0}^{N-k-1} D_i\) と表せ、これを \(X_k\) とします。

求める答えは \(\min(X_0,X_1,\dots,X_{N-1},X_N)\) です。

前計算で \(A,B,C,D\) それぞれの累積和をとると各 \(k\) について \(X_k\)\(\Theta(1)\) 時間で求めることができます。前計算にかかる時間は、ソートが \(\Theta(N \log N)\) 、累積和をとるのが \(\Theta(N)\) なので全体で\(\Theta(N\log N)\) 時間で求められます。

投稿日時:
最終更新: