ツバサの備忘録

主に備忘録代わりに精進記録を載せていくつもりです。

ABC102 D - Equal Cut

問題
提出コード

解法

パッと見とっつきにくい問題。
まずは、3つのうち、どこか1つの仕切りを固定して考えるとして、どの仕切りを固定すると見通しがよくなるかを調べます。

f:id:emtubasa:20190425010205p:plain

まず、右端の仕切りを固定することと、左端の仕切りを固定することによる見通しの良さに差はありません。
ので、端の仕切りを固定したパターンと、真ん中の仕切りを固定した2つのパターンで見比べていきます。

  • 端の仕切りを固定したパターン
    このパターンでは、最終的な4つの数列のうち、1つの総和が確定します。今回は、右端の仕切りを固定して、Sが固定されたと考えます。
    すると、残った1つの長い数列を3分割して、うまく最適解を求める問題に帰着できます。が、この問題を解くのはあまり効率的ではないです。

  • 真ん中の仕切りを固定したパターン
    このパターンでは、数列が2つにわかれ、それぞれで、もう一つずつ仕切りを置く形になります。
    この時の最適な2つの仕切りの置き方を考えます。このとき、abs(P-Q)abs(S-R)がそれぞれ最小となるように仕切りを置けばよいです。
    簡単のためにP \lt QR \lt Sとします。実際の求める値のパターンは  S-P,S-R,Q-P,Q-R の4パターンであり、どのパターンでも、abs(P-Q),abs(S-R)が最小になるようにすることで、値を小さくすることができます。こちらのパターンの方が、先ほどの仕切りの固定の仕方よりも見通しが良くなります。

ということで、真ん中の仕切りを固定して、そのパターンについての残りの2つの仕切りの置き方を探し、これを全探索すればよいです。
ということで、あとは、とある数列に対して、それを二分したときの、それぞれの総和の差の絶対値が最小になるような仕切りの置き方を求めることができればよいです。
abs(P-Q)が最小となるようなP,Qの分け方は、2通りの方法で求めることができます。どちらの場合も、累積和をあらかじめ計算しておく必要があります。

  • 尺取り法で求める
    累積和は、数列の要素が増えるにつれて単調増加します。ので、尺取り法を用いると、rが数列の右端だった場合に、その数列の仕切りの最適な場所lが、O(N)で前計算した後、O(1)で参照できます。ll+1を見比べていって、lの方が差の絶対値が少ない場合、rに対するlが求まったことになります。

  • 二分探索で求める
    abs(P-Q)が最小になるということは、P,Qは、\frac{(P+Q)}{2}に最も近い値になっているはずです。ということで、累積和がこのような場所になる部分を二分探索で求めれば、O(logN)で求めることができます。

これらのどちらかを利用すると、真ん中の仕切りをある位置に固定したときの、残り二つの仕切りの最適な配置がO(1)もしくはO(logN)で求めることができるので、あとは真ん中の仕切りの位置を全探索していけばよいです。

感想

一見とっつきにくい600点問題ですが、丁寧に最適なパターンを調べていくと、解ける…ような問題です。累積和で前計算+αというパターンはよく見るので、抑えておきたいです。