ICPC 2020 国内予選 参加記

11/6に開催された国際大学対抗プログラミングコンテスト国内予選に参加しました.

チーム

2,3か月前にクマノミさん(renjyaku)とむげんさん(mugen1337)に誘っていただいてチームを結成しました.ACPCとKUPCに一緒に出て結束を高めました.

チーム名は僕の名前sotaからとってstate_of_the_artになりました.名に恥じぬ活躍をしたいぜ.

10/26 模擬国内

安定の10分遅刻(ごめんなさい).

前日のARCでチーム内のAtCoderレートが1番になってしまったので,僕がCを読みました.imos+DPという方針はすぐ見えたんですが,バグらせ要素が多くて唸っていました.添え字がめんどくさい,ijとxyの方向が違うので頭こわれる,盤面を回転するのでもっとこわれる.何とか1発でACしましたが,1時間ほどかかってしまいました.

むげんさんがDを見ていたので,僕とクマノミさんでEを読みます.読解難度が高かったですがクマノミさんに教えてもらって理解できました.問題文からなんとなく2-SATを感じたので,その方向で考えてみると,二分探索+2-SATでよさそうだと分かりました.ライブラリの写経をし,サンプルがあったので,テストを走らせます.実行が全然終わらず心配でしたが3分くらいで終わりました.AC.

残り1時間で,みんなでDを見ます.何もわからねえ.残り時間が少なかったので適当に思いついた解法を書き始めますがすぐ嘘だと分かります.もう駄目だろうなと思っていましたが,残り10分でむげんさんが解法を思いつき,残り3分でACします.感動しました.あきらめない心が大事.

結果5完,全体23位,学内2位という満足のいく結果になりました.予選通過相当の順位だったのでとても喜びます.しかし,学内3位のチームもかなり近いところにいるので,油断はできません.

国内予選まで

何度かバチャを走りましたが,基本的に精進そっちのけでライブラリ整備をしていました.データ構造にはまって,yosupo judgeをずっと埋めていました.遅延伝搬反転可能平衡二分探索木やsqrt treeなどの絶対使わなさそうなものばかり書いていました.賢い時間の使い方ではなかった.

前日になってさすがにやばいと思い,AOJ-ICPCの450点をちょっと埋めました.幾何,構文解析,サイコロの対策は全然してなくてちょっと不安が残りますが,本番に備えて早めに寝ます.

11/6 当日

起床AC.AOJを軽く埋める.大学に行く.学食で昼を食う.1時ごろにメンバーと合流.

とりあえずリハーサルをして,提出の仕方を再確認しました.時間がたっぷり余っていたのでAOJをやろうと思ったら,むげんさんに「夕食」という問題が面白いと教えてもらったので,解いてみます.点数が高くて難しそうでしたが,星の数がめちゃくちゃ多いので面白い問題なんでしょう.とりあえず自明な考察をしてむげんさんに確認したらよさそうと言われたのでその方向で考え続けましたが,細かいところが詰まりません.開始30分前になってもまだ解けておらず,このまま解けずに本番を始めるのは気持ちが悪いので,むげんさんにヒントを乞いました.そしたら完全に理解し,AC.これ面白い.似た考えのやつをこの前コドフォで見た気がする.

幣学最強のAobayama_dropoutが同じ部屋にいたので,毒を盛ったり盗聴器を設置することを検討しましたが,競プロマンシップに則って正々堂々と戦うことにしました.

4時20分あたりから緊張し始めます.色変を賭けたABCの前もかなり緊張しましたが,今回はもっと緊張しました.それはそうで,1年に1回しかないチャンスで成功したらアジアに行けるんだから,当然緊張するでしょう.

ICPC 2020 国内予選

4時30分,競技開始.コンテストサイトをリロードすると,データベースにチームがないみたいな表示が出ました.自分たちだけかと思い心配しましたが,同じ教室の他のチームも接続できていなかったようなのでおとなしく復旧を待ちました.10分ほど遅れて問題が公開され,コンテストが始まりました.

クマノミさんがA,むげんさんがB,僕がCを読みます.Cは約数を全列挙する自明な方針はすぐ浮かびますが,それだと\(O(p^\frac{5}{6})\)になってしまい,かなり遅い.しかしサンプルを試したらかなり早く終わったので,とりあえず脳死愚直全探索をぶん回すことにします.しかし実行が全然終わらない.走らせている間に何か考察をしようとしましたが,特に何も思いつきません.三分探索などを考えましたが,凸性の証明はできていないので怖い.どうしようもないので今実行しているやつを思い切って止めて,適当に枝刈りをしたやつを走らせ直しました.このとき,進捗を確認するための出力も入れてみたらでかいケースでも何秒か待てば計算できてることが分かったので,それを走らせ続けることにしました.合計30分くらい待って2つのファイルの計算が終わったので提出し,AC.愚直が落ちたら,やばいだろ.

むげんさんとクマノミさんがDを読んでいたので,Cを走らせている間にEを読みました.とりあえず4つの独立な問題を解いてその答えをかけ合わせればいいというところまではわかりました.二部グラフの安定集合の数になるな~とか言っていましたが,特に考察は進まず,また順位表を見て通しているチームが少なかったので,断念してDに行きました.

Dは制約がbitDPっぽかったのでその方向で考えましたが,何をbitで表せばいいのか全く見当もつきませんでした.半分全列挙を考えてみても,特に考察は進みません.木構造にしても,だから何という感じで有用な考察は得られませんでした.この時点で3完,学内3位で,アジアに行くためには最低でも4完が必要でした.残り時間が少なくなっていくにつれて焦りが募ります.

終了20分ほど前にクマノミさんが考察のブレークスルーを起こします.まず目標の文字を全探索し,他の文字がそれより大きいか小さいかをbit全探索します.そうするとその目標の文字にすることができるかどうかが判定できて,あとはその条件を満たす順列の個数を数えるだけです.チームがとても明るい雰囲気になりましたが,実装が,つらい....まず構文解析をして木を作るのが無限にめんどくさい.むげんさんに構文解析と木の構築を任せて,僕は探索のパートを書きます.終了5分くらい前になって書き終わりましたが,2人のコードをマージするときに相手のコードの仕様がわからなくなり,そうこうしているうちに時間切れ...

結果

f:id:pepsisoda:20201106222141p:plain

3完,全体73位,学内3位.当然アジアには進めません.

模擬国内では5完して大成功していましたし,今までのバチャでも4完はしていたので,こんな悪い結果になるとは思いませんでした.本当に不甲斐ない.

反省

僕がCを通すのが遅すぎた.Dは,解くべき問題だった.Eも,本質的な考察はほとんどできていて,1歩進められていればbitDPに落ちていたので,そこまで行けなかったのが残念.

正直模擬国内がよかったので国内予選もいけるだろと高を括っていました.そのためまともにICPCの対策をせず,意味のないライブラリ整備に時間を費やしてしまいました.謙虚に,やるべきことをやるべきだった.

感想

本当に悔しいです.今年限りのチームなので,絶対にアジアに行きたかった.

ICPCが終わったらのんびり隠居生活をしようと思っていたんですが,そんなことをしている場合ではないですね.来年までに強くなって,次は絶対にアジア大会に行きます.

チームメイトの皆さん,本当にありがとうございました.東北大学からアジアに行くチームの方々は頑張ってください.ICPCに出た皆さん,対戦ありがとうございました.