TCO '11 Round3
ドハマリ回orz
Result
94.91 / Unopened / Unopened
0チャレンジ
181位
1859 -> 1904
Easy ArtShift
問題
S[0],S[1],...,S[n-1]を色の配列とする。各色はWかBのいずれかである。
P[0],P[1],...,P[n-1]を0からn-1の順列(各数字がちょうど一度ずつ現れる数列)とする。
S[P[0]],S[P[1]],...,S[P[n-1]]を新しいSとすることで新しい配列が得られる。
この操作を何度も繰り返すことで、配列がいくつか得られる。
Sが与えられたとき、一つの順列から得られる異なる最大の配列の数を求めよ。
n≦30
試行錯誤
これはWとBの順番には依存しないで、個数のみに依存するっぽい。
SとS'で、要素i,jが入れ替わっていたら、Pも同じようにiとjを入れ替えれば同じ数の配列が得られるので。
順列によって要素はいくつかのグループに分かれる。
P={1,2,0,4,3}とかだと0→2→1→0……というループと3→4→3……というループができる。
ループがいくつか出来て、それぞれの周期がわかると、全体の周期は全部の周期の最小公倍数。
じゃあdp[i][j][k]を残り長さi,残りWがj,今までの最小公倍数がkであるような周期の最大値とするようなDPはどうなるんだろう。
すごく頭がこんがらがる。
再帰だと、最小公倍数の部分がどう書けばいいのかわからないし、ループでも更新どうしていいのかわからない。
(……50分くらい悩む)
そもそも一つの輪のサイクルっていくつになるんだろう。(←いまさら)
あ、全部同じ色なら1で、そうでないなら長さに決まってるじゃんorz
ってことは、グループのうち二色以上入ってるものの大きさを全探索すればいい。
今までのところのループの周期の約数になってるグループの長さは考えなくていいので枝刈り。書いた。
最大ケース0.001秒。
もう敗北はほぼ確実なので、じっくりテストしてから送信。
Challenge Phase
みんな250がDP解だ。見てみるがよくわからない。
てか凄い勢いでチャレンジされていく。
日本人つながりでLayCurseさんのコードを見てみる。
あれ、dp[w][b]で公倍数考えないでmax取ってるけどいいのかこれ?
なんか落ちそうな気もするけどチャレンジケース思い浮かばないのであきらめる。
ぼーっと眺めて終了。
System Test
250も500もめちゃくちゃ落ちてる。
自分の250は通った。