Yandex 2011 Qualification Round #2

#1 のほうが参加しやすい時間だったのだが、体調不良で寝込んでいたので #2 に参加。

A. Double Cola

大学入試にたまに出てくる群数列の問題かと思ったが、サイクルをまとめてシミュレートしていけばよい。一周あたりの数は指数関数的に増えていくから、時間は足りる。

すぐ出した。

B. Sets

方針が立たずに、メモにごちゃごちゃ書いて考えていると、同じ紙の組み合わせで出現する数字は、同じ集合由来だと分かった。つまり、各数字ごとにどの紙に書いてあるかを hash<set<int> > 的なものに記録していって、これを転置すればよい。

Ruby でささっと書いた。n = 2 でもエラーにはなっていない。出した。ここまで30分ちょっと。

C. General Mobilization

時間ごとにシミュレートしていけば間に合うような、間に合わないような……

B. Sets

B 問題が落とされる。見ると、B が撃墜祭りになっている模様。10分くらい考えると、n = 2 のとき、自分のコードでは全ての数字が一つの集合に出てしまうことを発見。これは特別扱いが必要だ! コーナーケース n = 2を確認したつもりが、全然チェックできてなかったよ!

訂正して出す。

残り時間

C を考えるが、結局よく分からない。

B を自分も Lock して他人のコードを見るが、C++ で int 的な配列を使ってなにやらやっているコードが大半で、よく分からない。これらも n = 2 のケースで落とせるのだろうか? この時点の順位は 400位くらい、残り30分。このままでも通過に必要な500位には入れるだろうが、撃墜失敗すると危うい。……と考えているうちに、5つくらい他の人が落として行った。あー、もったいない、などと思いつつ離脱。

結果・考察

AB通る。373位。1709→1720。

B のコーナーケースを見落としていたのは痛い。n = 2 をテストしてたのに、実行時エラーにならないのを見て満足して、出力をよく見ていなかった。