ICPC2025年国内予選参加記Ayuna視点
目次
はじめに
faluna = Ayuna + Lazz + kotafuku として出場しました。
チーム名はLazzさん案でみんなのハンネから数文字ずつ持ってきました。
発音は多分ふぁるーな。
弊大学他チームはほぼ大文字勢だったのでかえって見つけやすかった。
今年は私の3回目のICPCの参加でラストイヤーです。
Rinshan Solutionが飛び抜けて強いので今年は横浜大会に進出することを自分の目標にしていました。
チームは3人とも多分、レートの割に考察力が高いタイプ。細かい得意不得意は違うものの、今年の私は典型担当かもしれない。強いて言うなら、私が発想と高度典型(?)担当、Lazzさんが考察・実装担当、kotafukuくんが早解き・数学担当という感じ。
そして3人ともPythonとC++を両方書けるものの、低難易度以外はC++派Ayuna、最近はC++で書くようにしているが慣れているのはPythonのLazzさん、ほぼPythonかつ普段の実行環境がJupyter Notebookのkotafukuくんと、環境構築では意見が割れまくりました。
ジャッジシステムはソースコードをファイルで提出なのでkotafukuくんには諦めて.pyファイルで書いてもらいました。
コードテストやオンライン環境でやっている人はよく見るが、Jupyterの人は初めて見た。
模擬国内
今年はM1ということで競プロ以外の人生タスクにかなり時間を取られてしまい、精進にあまり時間を取れなかった…
模擬国内の当日にLazzさんのパソコンに初めて触る。キーボードが全体的に大きくて手の移動が少し大変だった。
チームメイト2人はDOMjudgeを使うのが初めてorあまり使ったことがないということで色々仕様説明。
役割分担は私がAC、LazzさんがBD、kotafukuくんがEから解いていく感じ。
kotafukuくんの数学力が活きたらいいなという期待です。
ABは大きな問題なくAC。
Cはエラトステネスの篩でいいかーなんて適当な計算量見積もりによりTLE。ごめん。
Dの実装には若干苦労していたようですが、「!」の出力を忘れた1ペナをしつつもAC。
Dまで1時間くらい、ちょっと遅かった。
その間にkotafukuくんは「構文解析無理」みたいなことを言いながらFを見ていた。
構文解析を学ぶのにいいサイトのリンクを2週間前に送りつけていたんだけど…忙しかったしまあいいか。
そこで私がEを見るとパースはかなり簡単にでき、木DPっぽいところの計算もなんとなく浮かんでいたので実装を開始。
途中計算が合わず困っていた。しかもその計算をデバッグしようとしても全然コンパイルが通らない。
for文で構造化束縛しているところがずっとエラーが出るのでなんなんだと思い、「g++ --version」を実行。
g++-6だった。
一桁台、見るの初めてだった。
g++-6って何!?
普段の自分は落ち着いている方の人間だと思うのだけれど、あまりにも古すぎて、このあたりの時間は心を乱していた。ごめん。
なんとかその部分の実装を書き換えたものの、私が「あれ、この場合が困った〜」みたいなことを言っている間、Lazzさんとkotafukuくんも独立にEを考えてくれていたらしく、計算部分は分かったがパースができない状態だったらしい。
ということで、パース関数だけを残しLazzくんに実装を譲り、Fの考察に取り組む。
なんだ、分かっているんなら早く聞けばよかった〜、困ったら人に聞こう!と思った。
Lazzくんは最初私のパース関数をC++からPythonに書き換えようとしていたものの失敗。
C++の参照渡しがパースではかなり有能なのだけれどPythonではちょっとむずいね。
諦めてC++で続きの実装を始めたものの時間に間に合わず。
学内3位で危機感を覚えた。
反省点がたくさん。
初めてのチーム戦だったので声かけにお互い気をつかってしまっていた。
後半の難易度逆転に気づくのも遅れたので順位表をこまめにみることを意識するように。
国内予選本番前日
緊張していた。プレッシャーしかなかった。
模擬国内を踏まえて、私がボーダーとなる問題を解かなければという気持ちでいた。
心がぐちゃぐちゃな状態で夏インターンのお祈りと応用情報技術者試験の合格通知をもらった。
もっとぐちゃぐちゃになった。
1年前はチームメイトが強くて心強かったにもかかわらず予選通過できるか不安だったのだから、今年はなおさら。
夜はとにかく不安で、ボーダーレベルの過去問を解きまくっていた。
でも直前期は逆に問題を解くべきではないね。
1年前と比較すれば成長を感じるものの半分くらいしか解けず、諦めて夜中の3時半頃に疲れてベッドに入ったものの眠れず、結局眠りにつけたのは朝7時くらいだったと思う。
こんな時間まで起きたことないよ。
とにかく、例年の感じからしておそらくボーダーでなるであろう5問目(おそらくE)を早く解くことができるかどうか不安だった。
国内予選本番当日
朝から泣きそうになりながら大学へ。
研究室の居室でまた過去問に取り組んでいた。
やはり解けない問題がありますます不安が増幅し、お昼ご飯がなかなか食べられない状態で会場へ移動。
会場までの移動でも涙目になっていたが頑張って我慢。泣き虫、よくない。
と思っていたものの会場着いた瞬間に涙溢れちゃってチームメイトとコーチに心配をおかけいたしました。申し訳ございません。
なぜかパソコンにACLが入っていなかったのでC++版とPython版を急いで導入。そして、Lazzくんは事前にg++を15にアップデートしてくれていた。こころなしか少しコンパイルが早くなった気がするし、何よりこれで構造化束縛が使える〜〜
後輩に「元気出して〜」と言われながら諸々の準備をしていたら自然と気持ちの切り替えもでき、前向きになった。
変なところでツボって笑っていたのでまだ緊張はしていたと思う。
そしてコンテスト開始。
国内予選本番
模擬国内とは役割分担を変え、コンテスト開始直後は「Windows分からない」と言っていたMac派kotafukuくんの代わりに私がCDのプリントの手配をしながらkotafukuくんにAを見てもらいそのままパソコンを渡す。
私の大学では11チームが1つのプリンターを使うので最初混むよというアナウンスが事前にあった。
そのため多くのチームはすぐ必要な1、2問だけを印刷していたものの、たまに全問題を印刷したチームがいて面白かった。
全体的に印刷物の回収が適当すぎて、30分後くらいにはなぜか誰も回収しに来ない問題がコーチ席に束になって置かれていた。
コードを印刷する際は1行目にチーム名を書かないと渡しませんよともアナウンスされていたが、2回くらい書かないまま印刷してしまった。
無事印刷物を回収し私はCを、LazzさんはDを解いていた。
Cはすぐ解くことができ、Lazzさんが困っていたようなのでDの概要を聞く。
あー3乗通るのねー分からーん。
苦手なタイプの問題に見えました。
Aに続けてBを解いていたkotafukuくんが少し手間取っていたので途中で少し実装交代。
Bのバグに気づいた頃、こちらは9割実装を終えていたのでほぼ同時にAC。
この間にLazzくんがDの実装方針をまとめて説明してくれた。
合ってそうだったのでGOサイン。
BCのAC後LazzくんのDにパソコンを譲り、2人ともEへ。
でもkotafukuくんが「木やだ」みたいなことを言って早々にFGHを読んでいた。
Eを読んでみると、一瞬難しそうに見えたが制約を確認するとNが1000以下なので木DPしてから適当に実装できそう。
ABCの水diffくらいだろうと感じ、その瞬間、横浜大会へのボーダーはE早解きではなくF早解きだと思った。
チームメイトとは5完早解きくらいが横浜進出ボーダーだろうと事前に話をしていた。
6完が必要そうなことをチームメイトに共有し、「Fさえ解ければかなり安心」と自分に言い聞かせながらGHあたりを読んでいたkotafukuくんをFに引き戻した。
LazzくんがDの実装を続けていたので手書きコードを書いて念のため実装内容を確認していた。
整理しながらたまにチームメイトの様子を伺いFの概要を把握。
Dの1ペナ後、私がEの実装を始めた。先ほどの手書きコードを見ながらスムーズに実装できた。
ただ、デバッグを消し忘れて1ペナ。すぐ気づかず、Lazzさんと何回かパソコンを奪い合い(交代)しながらDEをほぼ同時にAC。
順位表を見ると14位まで上がっていて、2ペナあるものの早解きに成功していそうだった。
2完を狙いに行くか確実な1完か少し迷ったが、Fを全員で解くことに。
後ろから文字列を完成していくイメージだよねー、あとこういうのは操作によって起きる現象の言い換えをするといいよねーなどと考えていた。
Lazzくんが「この操作ってaがbの山を飛び越えてくるという風に見れるよね」と言ってくれて、これがかなり見通しがよかった。
これにより"B"の操作を連打するとa...ab...bという形になることがわかり、そこから操作をくるくるやっていけば文字数の制約の範囲内でなんでも文字列を作れることが分かった。
実装は基本Lazzさんがすることになったものの、なぜかランレングス圧縮が不安だったらしくそこだけ私が実装。
私が実装している間に2人がさらに解法を詰めてくれて、どのような操作を行うか簡単に計算できるように。
Lazzくんが残りを実装し無事AC。kotafukuくんが「これWriter解だわ〜」とコンテストが終了した後までどやっていた。
順位表を確認しGHのどちらを解くか決めようとしていた。Gの方が通しているチーム数は多いが、Rinshan SolutionがHを先に通していたのでHを解くことに。
インデックスの偶奇で集計すること、同じ括弧が連続している部分があると累積和を稼げるので移動できる範囲が広がることなど全員で考察を出し合い、計算方法があらかたまとまった。
またランレングス圧縮を使うということでそこだけまた実装。
その間にさらに考察を整理したLazzくんに実装を任せて、横で見守っていた。
一応と思いスキップしたGも見てはいたものの、残り時間を考え見守り続けることに。
このあたりでKTSKがFを通したのを確認。
後にKBMもFを通したのを確認し、学内で3チームが6完とかなりの接戦で、7問目を通さなければと焦り。
自分の実装の内容について横から補足しながらLazzくんが実装を進め、一通り実装が完成したもののテストケースが通らず。
残り15分ほど私は通ってくれと祈り続け、Lazzさんがひたすらデバッグを続け式を修正していったものの間に合わず。
コンテスト終了後と今後
終了直後KTSKの方を見るとブザービート提出をしたらしく祈っている様子が見えたが通らなかったらしい。
後から数バイト修正するだけだったという会話が聞こえたので、思ったより横浜進出は危なかったようだ。
順位表を見たら44位、学内では2位。
ルール上は自分たちより上で4チームが落ちていたら横浜大会進出確定なので強豪校を見ていたら、上位に科学大のチームが大量にいた。
強い人そこに固まっているのね。
ということで、同大学内2チーム出場のボーダーの少し上で予選通過。
それを確認したらお腹が空いてきた。
緊張がようやく解けたらしい。
Rinshan Solutionに全完後に何をしていたのか聞きに行ったら、絵しりとりを見せてくれた。
画伯と言われることもある私の絵とどっこいどっこいな絵ばかり(kemunikuさんの記事参照)。
前後の絵のおかげで最初と最後の文字が分かっているのにそれでも一体何なのか分からない絵があった。
PCTさんは野菜と生魚が苦手らしいが、私も同じなので勝手に食事の好みが似ているのかなあなど。
kemunikuくんは運悪く2年間国内予選で落ちていたけれど、大学に入ってくる前からずっととても強い人だと思っていたので今年横浜大会に進出してくれるのは嬉しい。
このまま世界大会に2回出てほしい。
チームとしてはやはり個々の力を伸ばす必要がある一方、模擬国内の反省を踏まえて、3人がそれぞれどのようなことに取り組んでいるか、どのようなことに困っているかを把握しながら進められていた点が良かった。
そこは一番経験のある私が特に意識して周りを客観視していくのが良さそう。
そして昨年の国内予選は強いチームメイトに助けられ何もできなかったので、今年は自分の力で(もちろんチームメイト2人分の力の方が大きいが)横浜大会進出を決められて嬉しい。
最近は、ICPC以外にもオンサイトに2つ出させてもらえることが決まり、私の競プロ人生、大学生活は恵まれすぎている。
これが当たり前でないことは常に忘れてはいけない。
今年の目標を一つ達成したということで、あとは大学(院)生のときにできることをやりきるだけ。
まだ、私のICPCは続くみたいです。ありがとう。