便宜上 A0=0,AN+1=L とします。
魚の座標が x であるときのコストを f(x) とおくとコストの期待値は L1∫0Lf(x)dx なので、I=∫0Lf(x)dx=∑i=0N∫AiAi+1f(x)dx を最小化すればよいです。
まずは次の問題を考えます。
- 座標 Ai と Ai+1 の間にマシンを k 台追加で設置するとき ∫AiAi+1f(x)dx の最小値はいくらか。
魚の座標が Ai≤x≤Ai+1 であるとき最も近いマシンの座標は Ai≤y≤Ai+1 であるため、∫AiAi+1f(x)dx は他に追加する M−k 台のマシンの座標には依存しないことに注意します。
- i=0 のとき、座標 2k+12j−1A1(1≤j≤k,j∈Z) にマシンを設置すると ∫AiAi+1f(x)dx=2(2k+1)A12 となりこれが最小です。
- 1≤i≤N−1 のとき、座標 Ai+k+1j(Ai+1−Ai)(1≤j≤k,j∈Z) にマシンを設置すると ∫AiAi+1f(x)dx=4(k+1)(Ai+1−Ai)2 となりこれが最小です。
- i=N のとき、座標 AN+2k+12j(L−AN)(1≤j≤k,j∈Z) にマシンを設置すると ∫AiAi+1f(x)dx=2(2k+1)(L−AN)2 となりこれが最小です。
(直観的な説明:正の実数 d に対して f(x)=d を満たす x(Ai≤x≤Ai+1) の個数を c(d) とおくと c(d) は広義単調減少であり、d を 0 に近い値から大きくしていったときになるべく c(d) の値が小さくならないようにしたいです。例えば i=0 のときは上記のようにマシンを設置すると 0<d<2k+1A1 の範囲で c(d)=2k+1 となります。)
(お詫び:厳密な証明ができていません。もしも間違っていたらすみません。)
あとは各 i について座標 Ai と Ai+1 の間に何台マシンを設置すれば I が最小になるかを求めればよいです。
先ほどの部分問題において設置するマシンの台数を k から k+1 に増やすとき、∫AiAi+1f(x)dx の減少量(=I の減少量)は次のようになります。
- i=0 のとき 2(2k+1)A12−2{2(k+1)+1}A12=(2k+1)(2k+3)A12
- 1≤i≤N−1 のとき 4(k+1)(Ai+1−Ai)2−4{(k+1)+1}(Ai+1−Ai)2=4(k+1)(k+2)(Ai+1−Ai)2
- i=N のとき 2(2k+1)(L−AN)2−2{2(k+1)+1}(L−AN)2=(2k+1)(2k+3)(L−AN)2
いずれの場合も I の減少量は k に対して単調減少します。したがって、マシンを追加していない状態からスタートし、最も I が減少するような i を選んでマシンを 1 台ずつ追加していく貪欲法によって答えを求めることができます。これは優先度付きキューを用いて時間計算量 O(MlogN) で計算できますが、このままでは実行時間制限に間に合わないため高速化が必要です。
この貪欲法において最後にマシンを追加するときの I の減少量を二分探索することを考えると、各 i についてマシンを追加する回数をそれぞれ O(logM) で求めることができ、O(NlogM) で二分探索の判定問題を解くことが可能です。判定問題は O(logLM) 回解けばよいので全体で O(NlogMlogLM) となり十分高速です。
なお二分探索時にちょうど M 回マシンを追加できる値が存在するとは限らないため、M−N 回程度追加できたら残りの回数分は愚直に貪欲法で求めるようにするとよいです。
以上により元の問題を O(N(logMlogLM+logN+logMOD)) で解くことができました。
実装時の注意点として、本問の制約の下では I の減少量を倍精度以上の浮動小数点数で表したとき二分探索が停止することが示せますが、その後の貪欲法を正しく実行するためには四倍精度等の十分高い精度の浮動小数点数を用いるか、分数を分母と分子に分けて整数の組として扱う必要があります。
実装例(C++)