一回日本最強プログラマー学生選手権決勝 D - Minimize Maximum
問題
整数列が与えられ、を、 を満たすようにとる。に対し、整数列の「 の最大値」の最小値を求める。
考察
ある区間で、「[tex: C{i+1} - C_i] の最大値」の最小値を考える。また、[tex: C{i+1} - C_i]はグラフの変化率と考えることができる。
はなるべく小さく、はなるべく大きい方がいい。よって、。 ここで、他のについて、を無視すると、
より、有理数の範囲での最大値を最小にするには、全てのを一定にすればよい。 このとき より、。
この区間で、全てのについて条件が満たされているとする。 すると、変化率の最大値の最小値は 。 任意のについて、より。 よって、このような区間で、。これは、
つぎに、を満たさない最小の について考える。のとき、で更新する。 すると、
前者は、変化率が減少しているので、変化率の最大値はこの区間ではない(この区間では変化率は真に減少するので)。後者は、この区間で変化率の平均をこれ以上小さくできないでの、これよりも最大値を小さくする更新はない。また、未満で更新するとき、変化率がより大きくなってしまうので、をとることが最善である。
からの区間での変化率の最大値の最小値は、。
同様に、のとき、で更新すると、
今度は、後者で変化率が減少し、前者はで更新するのが最前であることがわかる。
この更新後、からの区間での変化率の最大値は、条件を満たさなくなるもうち、である。
以上より、帰納法によって、ある区間でであることが示せた。求めるのはからの区間なので、各についての答えは
有理数の範囲で議論したが、結局を小数以下切り上げすれば整数の範囲での解が得られる。
解法
について、
より、を高速で求められればよい。
において、かつとなるためには、がを結んだ線分より下側にある必要があるので、このような点(凸包)だけ保持して三分探索を行う。
実装
感想
式化はわりとすぐ思い浮かんだけど、証明するのと実装するのにかなり時間がかかった。 凸包はちゃんと復習をする。