つちのこの日記

競プロと音ゲーがメインです。

ICPC 2023 国内予選 参加記

はじめに

ICPC 2023 国内予選に nok0Kite_kumazkou で出場しました。予選 3 位で、アジア地区予選への出場を決めました!嬉しい

チーム紹介

nok0

数え上げが好き(得意ではない)。実装は割とできるタイプで、タイピングが早めなのでめんどい実装を気合でゴリ押す問題が得意。時々変な知識を人のブログで仕入れたりしている。

ICPC で良く出る構文解析、幾何とかは全然出来ないのでチームメイトに任せている。最適化も苦手。

Kite_kuma

ぼくができないこと全般が得意そう。構文解析も幾何もできる。数え上げは得意じゃなくて嫌いらしいが、ぼくの ARC162 の D,E を普通に通していたので数え上げ苦手でもなさそう。

幾何とか DP とかをよく書いている。

zkou

天才。典型知識は橙なのに全然なくてびっくりするけど、構築とか天才パズルに異常に強い。また、国内予選はいつもぼくと Kite_kuma はすごい緊張しているが、彼は緊張せず毎年高いパフォーマンスを発揮しているので凄い。

Python 使いかつ実装が遅いので、並列なしのコンテストでは実装 0 で、常に考察をしてもらっている。

まとめ

3 人の得意分野が全然違うので、チーム全体としてはかなりバランス良くまとまっている気がする。チーム 4 年目なこともあって、最近連携もかなりスムーズになってきていい感じ。

前日まで

去年まで予選は並列ありだったので、並列なしでの練習を繰り返していた。 毎週あった Universal Cup はめちゃくちゃありがたかった。正直国内予選、模擬予選の問題は殆ど使い果たしていたので、適当に残ってる問題でセットを組んで 3h 練習するのも何度か行った。

当日(コンテストまで)

朝起きたら緊張が酷かったので、午前中は音ゲーをして緊張を緩和することにした。音ゲーでそこそこ高いスコアが沢山出てテンションが上がった。

14 時前くらいに大学に集まって、準備を始めた。モニターの配置やキーボードの配置などをして、リハーサルで 1 問通した。

15 時からは暇だったので、お菓子を買いに行き、お菓子食べながら暇だ~と言っていた。隣のチームから何位目標?と聞かれ、Speed Star と tonosama に勝つのは流石に厳しそうなので、3 位目標かな~と答える。(まさかこれが現実になるとは思ってなかった)

16 時 20 分くらいから、また緊張してきて困った。

当日(コンテスト)

コンテストが始まったので、問題文を印刷する。プリンターの調子が悪くて、印刷が遅くて焦る。

とりあえずテンプレを写経しながら、Kite_kuma に A を読んでもらう。自明だったので途中で交代し、実装してもらう。

A 問題を AC(3:41)

手が空いたので、zkou くんから B の概要を聞く。上からと下からをやると簡単に解けることに気付き、実装。

B 問題を AC(15:11)

C が構築だったので zkou に任せ、ぼくと Kite_kuma は D を考える。 7 個が上界と聞き、確かにーとなり、枝狩り全探索で解けることを主張。実装してもらう。

D の実装が終わったが重いらしいので、実装を奪って軽くする。まだ動かないらしい + zkou が C が解けたと主張しているので、D を print debug し、C の実装に移動。

C は、偶数行目について半分に分けて swap ->偶数列目について半分に分けて swap をすると通るらしい。本当?と思いながら実装をする。validator を書けと言われ、確かにと思いながら書くと、全てのテストケースでうまくいっていることが分かる。安心して提出。

C 問題を AC(39:56)

C をやっているうちに、D のデバッグが終わったらしい。直すと、そこそこの速度で実行が終わる。

D 問題を AC(44:06)

ここらへんで、前半が順調でみんなテンションが上がってくる。全員で E を考察。zkou が inline DP を主張するので、自分が整理するとセグ木を使って $ O ( N ^ 2 \log N ) $ で解けることが分かる。実装をすると一瞬で実装が終わる。実行すると、1 ファイル 5 分くらいかかり、色々定数倍良くしたりを考えるが、所詮 10 分で終わるので放置する。

E 問題を AC(1:26:25)

F は幾何だったので Kite_kuma と zkou に任せ、G に向かう。G で式を弄っていたら、 zkou が F の本質に気付いたらしい(天才!)。 Kite_kuma が実装すると...

F 問題を AC(1:43:47) !

正直、ここら辺で予選確定した感がありかなり嬉しかった。しかしコンテストはまだ 80 分くらい残っていたので、慢心せず G を解くこととする。

G 問題の式変形を終えると、zkou くんの変形と一致したので安心する。更に丁寧に変形すると、DP で持てる形となる。この時点では、 $ O ( N ^ 2 M ^ 2 \sum a_{i,j} ) $ だったので遅くて困ると言っていたが、二人に分配するとき、片方が空になるような最適解がないことに着目すると、$M$ が落ちて、十分高速であることを指摘される。これを丁寧に実装すると

G 問題を AC(2:20:44) !!!

G の AC により、地区予選進出をほぼ確定させ、チームメイトと喜びまくった。その後は H をぼんやり考えていたが何もわからず、順位表を見たりしていた。

まとめ

今回の結果は、正直練習と比べても一番高いパフォーマンスで、本当に嬉しかったです。ペナも出さず考察もスムーズで、最高に上手くいったコンテストでした。

zkou 君は C,F で天才を遺憾なく発揮してくれて、式変形の正当性などをしっかりチェックしてくれて本当に助かりました。 MVP。

Kite_kuma 君は、F の幾何をしっかり通してくれて神。コンテスト後に、F は丁寧に実装しないと落ちることを聞き、ひえーとなった。(多分ぼくが書いたら WA が出ている)

自分も、BCDEG の実装をして、ほぼバグらせず全部ノーペナで通せ、考察も BDEG ではそこそこ担当したので、中々に貢献できたのかなと思います。去年の国内予選はあまり貢献できなくて悔しかったので、その悔しさを今回で晴らせました。

アジア地区予選に向けて

アジア地区予選は、去年酷い成績を取ってしまったので、今年は頑張って良い成績を持ち帰れるようにしたいです。

自らの課題としては、チームの中で担当分野である数え上げがあまり強くないことが挙げられると思っていて、これからアジア地区予選までに数え上げが得意って言えるようになりたいです。あと他の分野も強くなりたいです。