AOJ 1522 - Planarian Regeneration
問題
提出コード
数ヶ月放置してから考察しなおしたらすんなりいきました。
解説がなくてわからない問題は寝かせるのも大事だと思います。
解法
まず、サンプルケースなどを利用して手元で計算すると、
(縦における原点からの距離×縦の辺の長さ、の総和)×(横における原点からの距離×横の長さ、の総和)
のように、縦と横にわけて考えてから、最後に積をとると答えになることがただちにわかります。
縦と横でやっていることは同じなので、あとは1方向に対しての求め方を探ればよいです。
具体例として、2:3で回切るパターンについて考えます。
初期状態は、(原点からの距離,辺の長さ)のペアは(1,1)の一つのみです。
1回切ると、
(1,2/5)と(3/5,3/5)に分かれます。
2回きると、
(1,4/25)、(21/25,6/25)、(15/25,6/25)、(9/25,9/25)の4つに分かれます。
全ての部分を2つに切っていくので、回切ったとき、個の辺ができます。
また、に切断していくとき、現在辺の長さがの部分を切ると、あたりまえですが
との2つに分かれます。辺は最初1ですので、全ての辺は
- で回切断するうち、何回を選んだか
という回数で場合分けをすることが可能です。
回切断したときに、回を選んだものの個数
とすると、
となります。
次に、回を選んだ場合の長さを求めます。
回切断したときに、回を選んだものの辺の長さ
とすると、
となります。
辺の長さが出せたので、あとは原点からの距離を求めれば終わりになります。
先ほどの続きとして、現在辺の長さがであり、原点からの距離がである部分についてみてみます。先ほども述べたように、これをで切るととの2つに分かれます。このとき、長さがになった辺は、原点からの距離はのままであり、もう片方の辺の原点からの距離は、から左側の辺の長さ、すなわちだけ引いたものになります。
もうすこし見やすくすると、
今原点からの距離がの辺について、回までで回を選んで切断していた場合、次の切断をしたときに辺の原点からの距離は、
を選んだ側
を選んだ側
の2つに分かれます。
これを、を選んだ回数ごとに距離を先に合計しておきます。
回切断したときに回を選んだものの原点からの距離の合計
とすると、
となります。
これで必要なものがそろったので、あとは
(原点からの距離)×(辺の長さ)
の総和を求めます。これは
をについて全探索して合計していけば求まります。
最後に、縦と横それぞれについてこの操作を行い、かけあわせれば答えとなります。