しがない材料学徒。

しがない材料学徒。

誰も留年しないやさしい世界へ

ICPC 国内予選 2022 参加記 (haruki視点)

こんにちは。harukiと申します。初めての参加記です。

国際大学対抗プログラミングコンテストへきささん白椿さん,私harukiのチームSpring Curveで出場し,298チーム中35位でアジア大会への切符をつかみ取りました!!!

ICPCって???

6~7問程度の問題が出題され、3時間の競技時間でどれだけ多く、早く、正確に解けるかを3人1組のチームで競います。問題の読解力、解法の考案力、そしてプログラミング能力が勝敗のポイントになります。

3分でわかるICPC | ICPC 国際大学対抗プログラミングコンテストより引用しました。出題される問題の例はここから見られます

当日の流れ

ここからは当日の時系列順にどんな感じだったかお伝えしていきますね。

開始8時間前~2時間前

同じサークルに所属してる2年前から交流のある人たちと初めて会っておしゃべりしたり,今年はじめて出場する1年生たちのリハーサルの問題提出のお手伝いなどをしていました。リハーサル中の午前9時の時点で1年生チームの提出が0だったので,個別にdiscordのdmで連絡を取ってみたんですが,やはりかなり詰まっていたようで,ICPCの提出形式の難しさをひしひしと感じました。

開始2時間前~1時間前

授業を受けているキャンパスとは別のキャンパスで集合してみんなで1つの教室を借りて解くことになっていたので,電車で移動を開始します。東京の電車路線は,千葉の奥地に生息している私にとっては非常に難解で,乗りかえを1度間違えてしまったのですが,5分後に同じ行先の電車がすぐきて感動しました。さすが大都会東京ですね。このミスによる遅れはわずかなものでしたが,気分的に少しでも早く着きたかったので,少し値は張ってしまいますがつくばエクスプレスに乗ることで,無事予定した時間通りに集合場所の最寄り駅に着くことが出来ました。

開始1時間前

10個くらいある駅の出口に迷いながらもなんとか駅を脱出し,集合教室に到着しました。チームメンバーのお二方はすでに到着しており,PCの前で競プロの問題を眺めていて気合十分といった感じで,私も自然とやる気が湧いてきました。そこからは軽く雑談したり,方眼紙とか画用紙とかの考察道具の話で盛り上がったり,なにか生協でお菓子でも買おうかみたいな話をして,荷物番をかねて交替で飲み物等買い出しに行きました。

開始15分くらい前

先ほどの考察道具の話の中で「トランプもあったらいいよね」みたいな話が出ていたんですが,買い出しから帰ってきた白椿さんの手にはトランプが握られていました。行動力あるな~と思う反面トランプの問題なんてほんとに出るのかな…と思っていました (が,なんと実際に出題されました。もしかして事前に問題知ってた???)。その後はドキドキしながら問題が配信されるのを待ちます…

開始0分~6分

問題が配信されました。今年はこんな感じの問題セットでした。

例年開始してすぐはサーバーがへばってしまうので,今年もどうせ落ちるやろと思っていたらスムーズに始まってびっくりしました。解く問題はAtCoderのレートを加味して事前に私がA,白椿さんがB,へきささんがCと決めていたので,担当であるAに取り掛かります。ICPCは誤答時のペナルティが20分=1200秒とかなり重いので,くれぐれもミスをしないよう多少スピードを犠牲にして丁寧に実装することを心がけました。そのかいあって6分00秒で一発AC(正解)することができました。結構早いかなと思っていたんですが,このとき75位くらいだったので,みんな度胸があるなあと思っていました。同時に,この問題の提出コードが国内予選にて私が書いた最後のコードとなりました。(プログラミングコンテストとは???)

開始6分~20分

練習の時は,Aが終わったらCをへきささんと一緒に解いていたので,それにならってC問題に取り掛かりました。問題をひとしきり読み終えて,練習しても休んでもどんどん効果が増幅していくので,練習はできるだけまとめてガッツリやる,休息はできるだけ分散してこまめに取るというのが最適だろうなとわかりました。そこで \displaystyle N,M \leq 10^6という制約から,休憩を取る回数を全探索すればよいことがわかり,その旨をへきささんに伝えると,一瞬ですべてを理解したようで即座に実装に取り掛かり,開始20分くらいでACしてくれました。僕はへきささんに言われるまで,連続する奇数の和=平方数になることを完全に忘れていたので,自分一人では絶対に解けなかったと思うので本当に助かりました。

開始20分~30分くらい

白椿さんがB問題で苦戦していたようなので,みんなで解こうかという話になりましたが,白椿さんが「人数が増えてどうこうなる問題ではない」と言っていたので,そのままBはお任せしてへきささんと2人でD問題に行くことにしました。お恥ずかしいことに,D問題はこの後開始1時間30分くらいまでずっと誤読して別の問題を考えることになります(ゲートに並んでいるうち最前列にいる人たちの番号でソートして会場の入場列に並ばせる,というのをゲートに並んでいる人がいなくなるまで繰り返すのかと思っていました)。へきささんが入場希望者の列のうち必ず切らなければならないところの条件を教室の黒板を用いて共有してくれましたが,正直なところそれを咀嚼して理解するのがやっとで,その先の考察にはなかなか進めていませんでした。

開始30分~40分

白椿さんがサンプルを一致させてB問題を提出するもWA(誤答)だったようなので,私もB問題を考えることになりました。そこで,私の問題・解法の把握時間短縮と,白椿さん自身が説明することで何かミスに気付くかもしれない(ベアプログラミングってやつですね)のをかねて,問題と誤答だったコードの挙動を説明していただきました。案の定すぐに間違いに気づいたようで,即座に修正してACしてくれました。

開始40分~1時間20分くらい?

ABCの3問が解き終わったので全員でDに取り掛かります。この時点で確か45位くらいで,Dも少しずつ通されていたので,このDの出来でアジア大会に行けるか否かが決まると確信しました。考察は「必ず切らなきゃいけないところを切って,あとは自由に切れるはずだけど,切ってはいけないところが存在していて,そうなる条件がわからない」というところまで来ていたのですが,そこから先がなかなか浮かびません。へきささんが切ってはいけないところの条件を仮定し,一度提出しますがWAでした。

開始1時間20分くらい?~1時間50分

引き続き切ってはいけないところの条件を考え続けるのですが,隣接している要素の大小しか考えていなかったせいで迷走します(これでは解けない)。ここでようやく誤読に気が付き,今までの考察がほとんどパアになり愕然としました。しかしへきささんが愚直解法と比較することで,同じ区間で前にいる人の番号の最大値によって切れるか切れないかが判定できることに気が付いたようで,それを実装してもらって祈りながら提出して_______AC!!!。この時点で29位でした。

開始1時間50分~終了

Dを解き終わってあと70分ということで,残り時間は多少解かれているEとFのどちらかに全振りしようということになったので,チームみんなでEとFに目を通して,かっこ列っぽいねとすぐわかったEに賭けることに。配置を1つ構成すればよいということで,何かいい方法がないかを模索していましたが,私はこの後はひたすら時間を溶かし続けました。途中へきささんがGを見に行ったりしていましたが,大きな収穫はなくそのまま競技時間が終了します。

終了後

順位表をみて大学内1位で35位だったので,予選通過が確定し,やったねーという感じに。その後は感想会と晩御飯を兼ねてファミレスで食事をとりました。最初はサイゼリヤでやろうかとなり,最寄りの店舗に向かったのですが,まさかの満席でびっくりです。金曜の夜をなめてましたね。サイゼリヤは無理そうだったので,近くにあったロイヤルホストというところに初めて行ったのですが値段が高くてこれまたびっくりしました。

感想

普段の練習の時はA問題を解くだけ解いてあとは白椿さんとへきささんが活躍するという回がほとんどでかなり申し訳なかったので,本番ではC問題でわずかながら貢献できてよかったです。またこれはチームとは直接関係はないですが,所属しているサークルの新入生含むすべてのチームが1問以上正解できていたので,サークルから出場する全チームのコーチとの連絡役となった身としては,みんなでICPCにでてよかったな~としみじみ思いました。

とはいえ良かった点だけではなく,練習や本番を通して知識・実装力がお二方に対して圧倒的に劣っているなと感じるので,そこは今後の課題かなと感じています。

何はともあれ3回目のICPC出場にして初の予選通過!しかも今年はオンサイトで開催っぽいので,すっごく楽しみです!アジアに出場予定の方,よろしくお願いします!そして国内予選に出られたすべての方々,お疲れさまでした~!!!