ICPC2025国内予選参加記
はじめに
ICPC(国際大学対抗プログラミングコンテスト)2025国内予選に参加し、そしてなんと!!国内予選を通過しました!!!!
UEC25Atsumareが自分らのチームです
すごく嬉しいです。アジア予選も頑張ります(とは言っても周りが赤とか多すぎて轢き殺される予感しかしないが…)
チーム紹介
「UEC25あつまれ~!!」というB1の9割近く[1]が参加しているDiscordでチームを組んだのでUEC25Atsumareです。
- 自分:
- B1。
- Rubyist + Neovimmer。
- Pythonを書きました。
- Highestは水色。
- くらげ:
- B1。
- C++er…かな?
- C++を書いてました。
- Highestは青。
- rein:
- B1。
- Rustacean。
- C++を書いてました。
- Highestは緑。
参加前
自分含め全員が忙しかったため、ほぼ全くICPCに向けた特訓というものをしていませんでした。
せいぜい一回だけ過去問バチャ会をやった程度です。
自分に至っては日程すら把握しておらず、「えっ今日なの!?」というのをDiscordで知ったというひどい状態でした。さらにルールもほとんど把握していませんでした。(ペナが20分、PC/キーボードは1台、C++ / Python / Kotlin onlyということくらいしか知らなかった)
何なら勘違い(順位が「点数順、tiebreakerとして最後に解いた問題の回答時間 + ペナ」だと思ってた)もしてた。
当日
験担ぎで当日の昼はカツカレーを注文。
自分は4限がなかったので事前に会場に行き、環境構築をしていました。
- 自分用にチューニングされたNeovimのセットアップ
- oj、oj-bundle、expander-pyの導入
- ac-library、ac-library-pythonのダウンロード
- cpprefjp、Python Official Docsのダウンロード
- Ruby(テスト用)の導入
- コンテストサイトのログイン確認
- なぜか
http://
が生きていてそっちでアクセスしようとしてしまった...
- なぜか
- キーボードの持参(会場のキーボードがHHKB Lite 2だったので、自宅から一般的なメンブレンキーボードを持参)
- ディレクトリの作成
そこに実験を終えたくらげさんが到着し(おおよそ16:10)、最低限のVSCodeのセットアップをしていました。
そして16:30、競技開始。
A問題(0:03)
自分が実装しました。問題文通りにやればOK。
焦ってしまい、a + b
で提出しかけた...(ojでちゃんとテストしたのでGot Kotonaki)
B問題(0:08)
自分が実装しました。
range(N + 1, N * 2 + 1)
を長さ(L
)とし、S[i] or S[i - L]
で構成した後にstartswith
とendswith
でチェック。S[i - L]
の部分が脳内で混乱してちょっと遅かった...
C問題(0:17)
くらげさんが実装していました。その間に自分がDを考察。
ロジックミスがあって計算が合わなくて遅れました。
ちょうどここらへんでreinさんが到着。
D問題(1:04)
自分が実装しました。その間にくらげさん・reinさんがEを考察。
- ランレングス圧縮を縦横方向にかけます。
- (実はランレングス圧縮のコードが間違っていました。そしてそれでなぜか通っている...)
- 辺の長さが(もし定まるとしたら)は
max(map(lambda c: c.length, vertically_compressed), map(lambda c: c.length, horizontally_compressed))
です。 - 両方の圧縮後が2要素以内で収まる場合は特別扱いをします。これは常に有効ですが、辺の長さは不定です。
- その後、上下端は縦方向のチェック、左右端は横方向のチェックを除き、辺の長さが候補に合っているかをチェックします。
- (実際のコードは特別扱いの短絡パスが大量にあったりとか、縦方向と横方向で別計算したりとかしたので実装に時間がかかりました......もう少しスマートに書けるようにしたい)
E問題(2:21)
くらげさんが実装していました。その間に自分とreinさんでFを考察。
途中でFの考察が終わったので、交互にコードを書いていました。(本来は良くない...かも?)
Print拡張機能を入れていなかったため、htmlを作成してpreで印刷...ということをやっていました。良くない。
F問題(2:28)
自分が実装しました。前述の通り、Eのデバッグも同時並行で行っていました。
その間にくらげさんとreinさんがG/Hの考察。
- 操作は正規表現で言うと
/b(a+)/
->\1b
、/a(b+)/
->\1a
と置き換えられます。 - a、bの総数は変化しないので、変化している場合はその時点で不可能が確定します。
-
/a+b+/
の形にした後に、後ろから構築していけば実装も簡単にできることに気がつきます。 - ちょっと不安だったので、
/b+a+/
のパターンも実装。- 今考えれば雑に計算しても
n * (n-1)
なので要らなかった...
- 今考えれば雑に計算しても
- 念の為チェック用スクリプトをRubyで実装し、ojのjudge-commandでチェック。
- チェックスクリプトの実装に20分かからないならお得。
G問題(未完)
reinさんが実装...している途中にバグを取り切れずコンテスト終了しました。
コンテスト終了後 / あとがき
「おつかれ~~(拍手)」
「んじゃ順位見ていきますか、順位は...47位!そして学内順位は...(Ctrl+Fした後に「The university of El」を入れる)えっ学内1位!?予選通った!!!!!」(他の席「マジで?」「うそぉ!」)
って感じでした。
普通にダメ元で出てたので通ってびっくり。
その後先輩から「アジア予選は全部英語だしUS配列だしライブラリは紙でしか持ち込めないしセットアップもほぼ無理だよ」と聞かされて絶望しました。どうしよう。もう自分のneovimちゃんがいなければコード書けない。
その後雨に濡れながら帰ってカレーを食べました。ちょうど京王線で人身事故があったらしくそっちも大変そうでした。
チームメイトのくらげさん・reinさん、コーチ・監督を引き受けてくださったNafmoさん、ありがとうございました!
-
ユーザー数712人、B1は744人、サブ垢を考慮してだいたい8.5~9割くらい? ↩︎
Discussion