問題はこちら
問題概要
個のオレンジの大きさがとして与えられるとき, 全てのオレンジを箱詰めすることを考える. 一つの箱のコストはで, 個のオレンジを詰めることができ, 詰めるオレンジは連続した順番のものしか同じ箱に詰めることはできない. ある箱にいくつかのオレンジを詰めるためにかかるコストは, 箱に詰める最大のオレンジの大きさを, 箱に詰める最小のオレンジの大きさを, 箱に詰めるオレンジの個数をとしたときに, となる. すべてのオレンジを詰めるときの最小コストを求めよ.
思考の流れ
DPっぽい. どんな状態をもってDPするか. 箱の個数は持ってても意味ない. 連続したオレンジを一つにするから, 前からいくつまで見たかはいる. 今詰めようとしてる箱に入ってるオレンジの数や大きさの最大値/最小値なんかは持てない. 前からいくつという情報だけでやる.
を「番目までのオレンジを箱に詰めた時のの最小コスト」とすると, 更新式は
(は番目のオレンジ以前の連続した個のオレンジの大きさの最大値/最小値)
更新式の意味は, 番目までのオレンジを詰めて, から番目までのオレンジを同じ箱に詰める感じ.
最大値/最小値はを回すときに逐次更新していけばいい. よって計算量は
提出プログラム
https://atcoder.jp/contests/joi2016ho/submissions/12052288
感想
最大値, 最小値を求めるときにSegmentTreeを使ってしまった. 余計にlogが乗るので時間が危ない.