AGC028-B: Removing Blocks
数え上げ力の不足。
問題概要
1からまでの番号がついたブロックが横にならんでおり,ブロックには重さがある。ここから回ブロックを取り除くのだが,ブロックを取り除くコストはブロックと連結な(自身も含む)ブロックの重みの総和である。取り除く順番は通りあるが,それらのコストの総和を求めよ。
問題リンク:
解法
この手の問題は,「が何回加算されるか?」ということを考えるのが定石である(そこまではわかる,という人が多かったと思う)。特にこの場合は,「ブロックを取り除いたときにが加算されるのは何回か?」ということを考えればよい。各についてこれを足し合わせれば「が何回加算されるか?」という問いの答えがわかる(ここまではよかった)。
では,「ブロックを取り除いたときにが加算されるのは何回か?」という問いを考えよう。簡単のため,とする。公式解説では確率を用いているが(これはこれで賢い),実は確率を持ち出さなくても十分である。ブロックを取り除いたときにが加算されるためには,ブロックを取り除くまでに,ブロックからブロックまでが取り除かれなければよい。そのような順列はいくつあるかを考える。
とおこう。これらからの個の数の並べ方のうち,が一番最初になるのはもちろん通りである。これを1からの順列に埋め込むことを考える。埋め込む位置の選び方は,箇所から箇所選ぶ場合の数なので,通りである。から以外の数字の並べ方は任意でよいので,通りある。以上より,「ブロックを取り除いたときにが加算されるのは何回か?」という問いの答えは,とわかった。
のときも同様に考えて同じ表式を得る。あとは,の累積和を事前に計算すれば,「が何回加算されるか?」という問いにで答えることができる。よって,全体でで計算ができる。