アルゴリズム忘備録

競技プログラミングとかデータ分析とか

yukicoder No.1012 荷物収集

yukicoder.me

 

ちょっと複雑な累積和。次のような状況を想定する。

 

[左の荷物群の初期位置]  運びたい位置X  [右の荷物の初期位置]

 

累積和を取ることで、「左の荷物群をその荷物群の中での右端まで異動するためのコスト」のテーブルが構成できる。

 

あとは「左の荷物群の中での右端」からXまでの移動コストだが、これは左の荷物群の総量と「左の荷物群の中での右端」からXまでの距離の積になる。これで左側がクエリごとにO(1)で計算できた。右側も同様。

 

あとは左と右に荷物を振り分ける作業であるが、これは二分探索すればよい。計算量はO(log(N) * Q)。

 

二分探索で見つけたインデックスに±1といった調整が必要になるので、二分探索した結果がどこにあるのか常にイメージで持っておく or 適当に総当りのいずれかが必要。