水銀メモ_________φ

外部記憶装置として再開

CodeForces #266_Div2 : C. Number of Ways

Problem - C - Codeforces

問題

大きさnの整数配列aが与えられる。
aを3つに分割したとき、分割したセグメントの和が全て等しくなるような
分割方法はいくつあるか。 という問題。
{\displaystyle  \sum_{k=1}^{i-1}a_k = \sum_{k=i}^{j}a_k =\sum_{k=j+1}^{n}a_k}

解法

全体の和 を  Sとおく。
前提として、 Sが3の倍数でなければ解は一つも存在しない。

配列を舐め  \frac{S}{3}を発見した地点から終端手前までループを回し、
 \frac{2S}{3} が出現するたびにカウントすれば解が求まるが、この方法ではO(n^2)となり間に合わない。
(  \frac{2S}{3}が出現した箇所から終端までの和は明らかに \frac{S}{3})

逆の見方をすると、 \frac{2S}{3} が出現した時点でのそれまでの \frac{S}{3} の個数が
正しい分割方法の解に含まれる事が分かる。
よって配列を舐めながら \frac{S}{3} \frac{2S}{3} の数をカウントし、
和が \frac{2S}{3}となる度にそれまでの \frac{S}{3}の数を答えとして足していけば良い。

計算量は O(n)となる。

ソース