AGC-030:Tree Burning

解けてよかった。

考察

まず,高橋君はどういう動きをすべきかを考えよう。直感的に,0(L)を中心として,左右に振れるような動きをしたくなる。つまり

  • 最初はi本分右に進んで,それ以降は左→右→...と進む。(1)
  • 最初はi本分左に進んで,それ以降は右→左→...と進む。(2)

これをi=1...Nで試したとき,その最大値が答えになる(この部分が非自明ですね,わかり次第(そして余裕ができ次第)追記します)。部分点解法は,iを固定したあと,この動きを愚直にシミュレーションすればよい。
Submission #3894463 - AtCoder Grand Contest 030

では,満点解法を考えよう。要は,部分点解法ではシミュレーションにO(N)かけて答えを求めているが,これがO(1)でできれば満点だ。これはすぐにはわからないので,実験をしてみよう。例えばN=5で,i=1としてみよう。このとき,高橋君の歩いた距離は(実際に手を動かしてください)
 x_1 + \{x_1 + (L-x_5)\} + \{(L-x_5) + x_2\} + \{(x_2 + (L-x_4)\} + \{(L-x_4) + x_3\}\\\
=2x_1 + 2x_2 + x_3 - 2x_4 -2x_5 + 4L
さて,これを見てなんだかきれいそうな形をしているなあと思えないだろうか。実は,一般的には以下のような結果になる。対称性のため,(1)のパターンだけ述べることにする。

  • (i+N)が偶数のとき

m = (i+N)/2とする。数列\{S_i\}\{X_i\}の第i項までの累積和とする。このとき,高橋君の歩いた距離は
2(S_m-S_{i-1})-X_m - 2(S_N-S_m) + (N-i)L
である。

  • (i+N)が奇数のとき

m = (i+N+1)/2とする。このとき,高橋君の歩いた距離は
2(S_{m-1}-S_{i-1})- 2(S_N-S_{m-1}) + X_m + (N-i)L
である。

本当にこうなるかどうかに関しては, 実際に確認してみることを勧める(万が一違ったら,提出を参考にしてください)。(2)のパターンも同様の式で書ける(提出を参考にしてください)。
これは累積和を事前に計算すればO(1)でできるので,全体でO(N)で解ける。

提出

Submission #3895747 - AtCoder Grand Contest 030

  • Garbage Collectorの公式の解説放送では,りんごさんが実際に具体例で計算することでキーとなる式を導いていた。これと同じことを試したら解けたので,具体例での計算は大切だと実感。
  • 青にあと7届かず。