うにゅーん、って感じだ

だいたいのコンテストサイトで橙か赤です、よく C#を書きます。

ICPC 模擬国内予選 2026 参加記

毎回真面目に書こうとして途中で力尽きているので、今回は雑多に書いてみようと思います。
なので、雑多でも許してください。

問題選定・日程確定

今年度から、「問題セット責任者」という役割を他の方に押し付けて委譲してみました。
具体的な役割分担は(これを書いている今でも)あまり固まってないんですが、どの問題をどういう状態(どういう解法を通して、どういう解法を落とすか)で出すか、みたいな部分には意識的にあまり深入りしないようにしていたと思います(その余裕がなかったという話はある)。

あとは、問題選定に先立って問題案をこれまでの PukiWiki 管理から GitHub Issue 管理に変えてみたりしました。
Issue が追加されたり編集されたりすると GitHub Action が走って GAS 叩いてスプレッドシートに反映される、などをしていて、えらい(生成 AI がほとんど書いてくれました)。

また、日程に関しては Universal Cup や TOEIC を避けた結果 6/21 (日) になりました。サッカー W 杯と被ってしまったらしく申し訳ない……(けどそれがあると知っていてもこの日程になっていたかも)。
あと、準備陣に社会人が多いので日曜のほうがありがたいという話もあります。ここ 4 年くらい土曜開催だったけど、実はそれがイレギュラーでそれより前はずっと日曜開催だったんじゃよ……(これは老人発言すぎるか?)

ちなみに、開催日は基本的には国内予選本番直前の土日、またはその一週前の土日から選んでいます。
以前は「模擬国内で何か修正点が見つかったとき、そこから本番まで土日を挟まないのは困るだろう」という気持ちから後者を優先していたんですが、最近は模擬国内を本番前の最終チェックに使うチームもいそうだなと思いどちらでもいいかもという気持ちになっています(そもそも本番 2 週間前だとまだ固まりきってないチームもありそうだし)。

準備

JAG では、各問題に対し「データセット担当」と「問題文担当」に一人ずつ入ってもらって、その人が作ったものをみんなでブラッシュアップするという運用をしています。

自分は例年通り、基本的にはどの担当にも入らず、準備がヤバそうな問題がないか俯瞰したり、テストラン直前で誰も入ってないところにしょうがなく入ったりという動きをしていました。

結局自分が担当に入ったのは I の問題文担当だけでした。みんなちゃんと入ってくれてえらい。

それと、今年は「他の人に引き継ぎやすいように、今まで手作業でやっていた部分をなるべく自動化する」というのをやっていました。

具体的には、JAG での問題準備のための準備において、Rime で問題ディレクトリを切ったり、中の設定を書いたり、問題文管理のための Google Docs を作ったり、それを statements-manager から参照させたり、Discord のチャンネルを作ったり……というのを問題数分行う必要があり、しかもすべてが問題によって変えるべき場所が少しずつあったりして平気で数時間飛ぶ作業だったりしていました。
それを自動化するのにもコストがかかるので毎回まぁ自分がやるからいいか……、と思っていたんですが、さすがにそろそろ隠居しようという気持ちになり、これを自動化したりしていました。

他にも色々なところを自動化しています。

あとは DOMjudge と仲良くなったりしていました。具体的には、ユーザー、チーム、所属の api 経由での追加、ユーザーの有効・無効の一斉切り替えなど。
DOMjudge、バージョンが変わると api の仕様がちょっとずつ変わったりしてたいへん……。

(余談)コンテスト運営責任者として、何を重点的に確認するか

「どの要素がコンテストのクオリティを決めるか」というのはけっこう人によって意見が割れるところだと思います。
おそらく最も大事な要素のひとつは「問題(の解法)の面白さ」だと思います。ただ、これは問題選定された後には基本的には変わらないので一旦除外します。
個人的には、「問題文が正しく、あるべきように書かれているか」がけっこう重みを持っていると考えていて、実際にコンテストの構成物を俯瞰的に確認しようとなったときも問題文に接している時間がそこそこ長いと思います。これは自分が文章の書き方、特に要素の使い分け(半角括弧/全角括弧、半角カンマ/全角カンマ(または読点)、半角空白の入れ方、など)にこだわりがあるから、というのもあるかもしれないですが。

また、データセットに関しては作成能力とレートに比較的相関があるのでそこまで時間をかけて確認する必要がないことが多い、と考えていることも関係しているかもしれないです。

すべての要素にこだわりを持っているわけではないので他の方の指摘に救われることも多々あります。

JAG 内部コンテスト(テストラン)

JAG では基本的に本番一週間前に内部コンテストを行っています。今回は DECC か何かと被ってしまったため、参加できるタイミングで参加してね、と 3 回くらい開催しました(これ本当に偉くて)。

毎回選手より hos さんが強くてすごいなあとなるんですが、今回は本番と統合すると 1 位 kotatsugame、2 位 hos さん(、3 位 Rinshan Solution)という感じでした、強いなあ。

内部コンテストの段階では H と I が逆だったんですが、kotatsugame の熱烈主張により swap されました。結果的にかなりのファインプレー。

リハーサル

リハーサルの問題は全部自分が準備しました。前半 3 問は前回のリハーサルとほぼ同じで、残り 2 問は前回の模擬国内から引っ張ってきていますが……。

3 問目は結構教育的だと思っていて、1 <= x <= 109 を満たさないクエリを投げて WA になっているチームがそこそこありました(出力制約を満たしてない出力での WA は模擬国内本番の E でもあった)。

後ろ 2 問がかなり難しめの問題になっちゃったのはすみません。当たり障りのない問題を置こうとした(+インタラクティブでないスペシャルジャッジを置こうとした)らこんな感じになっちゃったんですが、そもそもノーコストで引っ張ってこれるのが昨年分しかない(それより前は DOMjudge ではなかったので)のが原因なので、来年以降は改善されるはず? です。

そういえばリハーサル中に問題セット全体の PDF のありかを clar で飛ばしました。気づきましたかね?

コンテスト各問題の雑記

A: ブービー賞

原案を出しました。
毎回、国内予選 A 問題くらいの簡単すぎる問題がなくて困るので適当に出しました、……と思ったけどログ見たら問題選定会議の途中で出しているので、今回も間に合わせだったかもしれません。

B: Rearrange

これも難しくせず素朴に出しているいい問題だと思います。

C: Loooong Vacation

原案を出しました。
有休を使ってゴールデンウィークを少し伸ばして旅行に行った先で作った問題だったと思います。
サンプルの 1 つ目は原案を出したときのものがそのまま使われていると思うのですが、実際の予定を少し脚色したものだったような気がします(さすがに有休はもっといっぱい持っているが)。

内部コンテストの運営をしながら追加の空間計算量 O(1) で書いたらそこそこ嫌な気持ちになりました。素直に累積和とか計算しておくのがいいと思います。

D: Box Tower

サイコロを出したいが難しくしすぎたくない、ということでけっこう苦労していた印象のある問題です。
最終的に制約をかなり易しくして今の状態になりましたが、順位表を見る限り正しい判断だった気がします。

E: 秘密の数と最大公約数

いい難易度のインタラクティブで、えらい。

F: ICPC is a Contest

結論がシンプルですごい。

G: XOR 旅行計画

変な計算量の問題です。こういう高速化が要求される問題久しぶりに見たかも。

Python (PyPy) で通すのにけっこう苦労しました。最初 BinaryTrie を書いたんですが、そのときはそもそも BinaryTrie に 2e5 回 add するだけで 1 秒以上かかっていて困った記憶。
結局比較的シンプルな実装で DOMjudge 上で 1.5 sec とかで通ってます。数列を陽に持っても分割統治みたいな感じになってるから計算量悪くならないの、言われればそうだけど非自明かも。
解説を書いたのでぜひ読んでください。

jag-icpc.org

H: 石取りゲーム

正直まともに考察していないのでどれくらい気づきやすいのかわかりません(これはちゃんと役割を委譲できていてえらいと見ることもできる(本当?))。

I: 悪のロボット軍団を作ろう

問題文を担当しました。
最初は一人用カードゲームでババ抜きみたいに手札内で一気通貫を作れたら捨てられる、みたいな問題設定を考えていたんですが、山札から引いた後にコストが一定以下になるように捨てる、ではなく引く前からコストが溢れないように捨てる、なのが意味わからなくて棄却しました。
結局かなりはっちゃけた問題文にしました。これにはちゃんと理由があって、設定がある程度ぶっ飛んでると問題の都合上必要な設定をある程度ねじ込みやすくなるからです。
気に入っていただけた方が何人かはいらっしゃったみたいで有難い限りです。

問題内容としては、各ステップにそこまで理不尽な難しさはないのにちゃんとボス問の難しさがあってすごいなあと思っていました(普段のボス問に比べると若干弱めかもだけど)。

(余談)問題のストーリーはあるべきか?

Universal Cup などで海外のセットを解いていると、たまに問題とまるで関係ない "Story" がついていることがあります。英語が読みたくないのもあって自分は即飛ばしますが。

これに関する自分の思想は明確にあって、問題の理解の助けになるならあるべきで、そうでないならないべき(あったとしても無害であるべき)と思っています。

今回の I 問題の場合、真ん中ら辺の箇条書きになっているところから問題が始まってもおそらく成立していると思うのですが、その操作をする気持ちになれなかったり、誤読しやすかったりということを避けるために、できる範囲で自然な設定をひねり出すということをしています。

なので、逆に例えば数式 1 つで表せるような問題にはストーリーはないべきだと思っています。

コンテスト中の話

本番サーバーへの模擬国内本番データのアップロードは、すべてリハーサル終了後から本番開始までの 2 時間で行っています。
api 経由で機械的に行われる部分が多いのでそこまで忙しくはないのですが、一部手動なところとか、間違ったらコンテストが壊れるところとかがあるので神経はけっこう使います。
(コンテストが壊れる失敗の例:間違えてリハーサルのコンテストに模擬国内本番のデータをアップロードしてしまい、選手に模擬国内本番の問題を見られてしまう、など)

ログで振り返ると、12:10 くらいに(選手のアカウントを無効化したうえで)始めて、12:40 くらいには終わったようです。

コンテスト開始後はゆっくり G の解説を書きながら観戦をしていたんですが、今回は障害対応が 2 件ありました(障害対応は自分が JAG のコンテストを運営するようになってからは初めてだったと思います)。

障害対応①

障害対応について書く前に、少し JAG のコンテストがどうやって運営されているかを(書ける範囲内で)書く必要がありそうです。 JAG のコンテストは、ICPC 横浜大会の運営に連絡を取って、特別にジャッジシステムを借り受けて開催しています(これは模擬国内の案内ページにも書いてある)。少しだけ具体的に書くと、DOMjudge が立った状態のサーバーをお借りして、その上で作業している感じです。

14 時のコンテスト開始時からページが重かったんですが、しばらく経った後に ICPC 運営の方から「フロントエンドのサーバーの負荷がヤバい」という連絡を受けました。

↓ 本当にヤバい

現状、ちょっとづつ latency と cpu 使用率が上がってきていて、CPU使用率が100%に近づいています。

メンテナンスは必須ということになり、その後具体的な対応方針を練りました。

  • メンテナンス時はアクセスできなくなるが、復旧時の挙動をどうするか
  • いきなり復旧するなら、選手側は F5 連打するのが最適解になってしまうので、時間を決めて一度ユーザー無効化をすべきか
  • それなら終了時刻も後ろに伸ばすべきか
  • などなど

その後 15:05 に以下の clar を流しました。初動から 20 分近くかかってしまったの反省(障害対応なんてしごとでもしないのに無理だよ~~~)。

clar に気づかずなぜかいきなりつながらなくなって焦ったチームもあったのではないでしょうか。
問い合わせメールが一件も来なかったのは、障害対応のページを見てくれたのか、それとも単に存在を知らなかったのか……?

当然起きないに越したことはない障害ですが、選手の貴重な練習の機会にはなったと思っておくことにしています。みんな clar はちゃんと見ようね!

障害対応②

こっちは影響を受けてないチームも多いので気づかなかった方もいるかもしれないですが、もうひとつ障害対応がありました。

流した clar (対応中と解決後)

概要をふんわりとだけ書くと、インタラクティブのジャッジで一部想定していないユーザー出力があり、そのせいでジャッジがエラー吐いて落ちて E 問題のジャッジだけ止まる、ということが起きていました。
原因特定を他の人に任せながら、なんとか他の提出のジャッジが走るように色々なボタンを押していたんですが、結局どのボタンを押すべきだったのかよくわかりませんでした。DOMjudge むずかしい。
その後ジャッジのバグを特定し修正、ジャッジを正常に戻し合計 20 分ほどで対応完了しました。

そのタイミングで E を解いていたチームには小さくない影響があったかと思います、すみません……(その間もボタンポチポチはしていたので、一部のチームを除きそこまで長い時間ジャッジが止まっていたということはなかったはずですが)。

本当に雑記

かなり疲れました(選手の皆様にはご迷惑をおかけしてすみませんでした)

次こういうチームが来たら勝手に途中で切るかも、切らないかも

そういえば半月以上体調が悪くてこまっていました

今回ほぼ 編集者+エンジニア みたいなタスクしかしてなくて競プロをしていない(まぁ競プロはみんなできるからね)

こういうことも毎年言ってる気がするな(みなさんはどう思いますか?)

おわりに

参加記ぜひお願いします!!!!!!

現役でない方はこちら jag-icpc.org