ICPC2024国内予選参加記 (Spinning-akabeko zawatin)

ICPC2024 国内予選 にチームSpinning-akabekoの一員として参加しました。6完23位!

チーム

(敬称略)

Abeshi2002: 考察、数学大臣。

CleyL: 考察、簡単枠の掃除、パズル大臣。

zawatin: 実装、典型大臣。

練習(~模擬国内)

チーム練習

ICPC-Japan Problemsから問題を選んでバチャを走っていました。週3。

Universal Cup Season3 Stage2も走りました。めちゃくちゃ難しかったけど、知見も多かった。*1

バチャを走る中でチームの戦略を固めていって、

  • CleyL -> AB
  • zawatin -> C
  • Abeshi -> D以降を読む。できそうなやつから解く。
  • あとはよしなに、得意分野と相談しながら。重い実装はzawatinがやる。

という感じになりました。

個人的な練習

1 幾何問題の対策

後半に置かれるような難しい幾何問題は最初から捨てるとして、前半に幾何が出ると困るので対策しました。*2

2 バチャの解き直し

解けなかった問題は解説AC。実装に苦戦した問題は特に苦戦したパートをライブラリ化しました。

3 悪あがき

本番数日前に重心分解を履修しました。kotatsugameさんの動画で重心を求めるコードを写真記憶 -> 重心分解使う問題を何問か通しました。付け焼き刃だったけど、当時は「この世の木上のパスの数え上げ全部解けるぜ〜」みたいな自信で溢れていました。

模擬国内

動き

CleyLがABを解いている間にC問題を読む。むっず!とりあえずSOSを出しておく。DがグラフとのことでAbeshiと担当を交代することにした。

D問題はグラフの連結成分を状態としたdpを考えた。CleyLがABを解き切っていたのでそのまま実装。サンプルが合わない。助けてくれ。

AbeshiがC問題の考察を終わらせていたので、AbeshiにPCを明け渡してD問題をCleyLに相談。

CleyL「例えば (2, 3) \rightarrow (1, 2) \rightarrow (2, 4)と操作が行われたとき、人 1が過去問 4を持っていないことは把握していますか?」私「把握していないですね。やっば。」

D問題が普通に解けていないことが判明。改めて考察しなおすが、全然わからない。困り果ててくねくねしているとCleyLが「実は既にEが解けている」と報告が来た。問題概要と考察を聞いた。あってそう以外に言うことが無かった。

程なくしてCをAbeshiが通す。自分はD問題で貢献できそうにないので、E問題の実装をもらって二人にD問題を任せた。

5~10分くらいでE問題の実装が終わる。一箇所バグらせたがCleyLの指摘により修正が秒で終わる。 -> AC

AbeshiがD問題解けたらしく、解法の確認もCleyLが済ませていた。そのままAbeshiが実装開始。私とCleyLでFの考察を始める。

二人でアイデアを出し合っている間にAbeshiがDを通す。G以降のAC数も少なかったのでそのまま3人でFを考えることにした。

各々で10分程度考えたあと、アイデア共有。Abeshiが「 \text{dp}_{i, j} :=  i体目以降のスライムについて、現在左端にレベル jのスライムがいる状態から操作を始めたときの最適値 ができるといいなぁ」と発言。

それを聞いたら天啓が降ってきて、 i体目のスライムをレベル jにするために必要なスライムの区間がダブリングの要領で求まりそうだと思った。

PCが空いているので私ががちゃがちゃこのアイデアをコードに書き下してみることにした。この解法が嘘だったときに踏まえて二人にはFの考察を続けてもらう。

ちょっと時間かかったけど実装が終わってサンプルが通る。二人が作ってくれた様々な入力ケースもパスしたので投げてみる -> AC。きもちええ。

3人でG問題に挑戦。残り時間が少ない。見通しの良いsomethingも無い。 O(N^{2}K \log (\text{hoge}))の愚直を書いて6分以内に実行が終わることを祈ることにした。それすら実装が間に合わずタイムアップ。全然サンプルが揃わなかった。

問題毎の感想

  • AB:
  • C: Abeshiも O(N^{3})で通していた。中点を列挙すれば良いことに気づけなかった。
  • D: 期待値の線形性... 苦手.... zawatin典型大臣解任
  • E: 去年の国内予選のEに似ている
  • F: ダブリングを使う問題あまり解いたことなくて不慣れだったけど、すっとでてきた
  • G: 類題を解いたことがあったのに解けなかった。申し訳ない.....

総括

  • 序盤うまく立ち回れなかった。私のせいすぎる。反省しています。
  • 最終的には良い成績が取れた。
  • AbeshiがC, DをCleyLがEをあまり時間をかけずに考察を終えていた。二人が考察強いことを再確認できた
  • 私はポンコツだったが、F解いたから許して♡

当日

前日の練習でうまく立ち回れなくて本番始まるまでテンションだだ下がりでした。自分から負のオーラが出てなければ良いと思うけど、出てたかも。

リハが終わった後は16時まで各々でのんびりしていました。私はサークル室(競プロ部では無い)に行ってシャニマスで遊んでいました。摩美々のリバーシブル・トーストを読みました。シャニPが頑張っているコミュは面白いですね。超どうでも良いですね。

16時以降はPC前に集まって雑談したり、戦略の確認をしたり、持ち込み物の最終確認をしたり。

コンテスト

動き

CleyLがABを始める。当初の予定通りCを読む。

制約が小さいのでBFSで解けることを確認。CleyLがABを通すまで算数解を考えてみることに。

全探索お姉さんの休日のような邪悪な座標系では無いようだ。つらつらと考えているとクエリ毎 O(1)で解けた。

CleyLがAB両方通しきった(2:41, 6:13)ので実装 -> AC(8:10)。

AbeshiからD問題が実装問題であると報告を受けて、そのまま私が担当することにした。問題読んで本当に実装問題だったので実装開始。入力受け取ったあたりで D 10^{18}くらいまで取りうることに気づいて横転。がちゃがちゃ書くより一回しっかり考えることにした。

一直線に進み続けるような移動はまとめて行うことにする。そうするとサンプル 1のような複数回同じ(座標, 向き)を経由するようなケースは問題無いが、サンプル 2のようなぐるぐるするケースが困る。

ぐるぐるする場合、同じ(座標, 向き)に来た時点でその「一周の長さ」を特定すれば良い。現在残っている移動距離を一周の長さで割ったあまりにまで短くすることができる。

一周の長さを特定する方法に少し悩んだ。stackにいままでの(座標, 向き)とこの状態における進む距離を計算して積んでおくことで、同じ状態に来た時にstackをポップして一周の長さを取得することにした。

後は気合気合と言いながら実装。100行くらいかかった.....。

ちょうど実装が終わったあたりでCleyLがEが解けてすり合わせもAbeshiとすませたと報告が来た。はっっや。実装変わりたいと主張してきたが、自分はサンプル試してデバッグするだけなので、ちょっと待ってもらうことに。

と思ったら一撃でサンプルが通る。ちょっと心配になりながら提出 -> AC(34:53)

喜びよりも困惑が強かった。100行も書いて一度もバグらないなんて経験競プロ初めて2年数ヶ月、一度も無かった。

AbeshiがFに集中していたので、私はCleyLのEの実装を後ろから突くことにした。E問題の概要と解法を聞く。解法が全然理解できなかったので、コードからわかる事実のみでサポートすることにした。

  • この添字はテーブルのここにアクセスしているよ とか
  • ここの実装が言っていることと違う気がするよ とか

数分後にAbeshiからFが解けたと報告を貰う。はっっや。私が解法を聞く。解法が完全に理解できなかったのと、数学色が強かった解法だったので実装はAbeshiがやることになった。

Fを相談している間にEの実装が大炎上したらしく、実装をFと交換することになった。

Eを手伝う前にGの問題を眺めた。構築やめて〜。E終わったらCleyLに投げることにする。

ひとまずEの解法を理解することから始めることにした。正当性はわからんがやろうとしていることは汲み取れた。自分でも図を書いてみて、必要な添字を把握。

Abeshiが実装終えたがサンプルが合わないらしい。ここで再度実装を交代。私がEを書き直す。

Eを書ききるがうまくいかない。まずい!。と思ったがCleyLから2箇所ほど指摘があってそこを直すとうまく動いた。模擬国のときといい指摘が美味いな。

提出を試みる。 N = 1でassertに引っかかったが、6分以内に直せてそのままAC(2:05:10)

AbeshiがFのデバッグをしている間にCleyLにGを渡す。割当っぽいしフローなんじゃないかなとか今考えると超的外れなことをCleyLに言ってしまった。

自分はFを手伝うことに。すでに一回ペナを出していて、Abeshiはそこの修正をしていた。自分は構文エラーとかを突っつきながら後ろで応援。

修正が終わって提出 -> AC(2:40:15)

残り20分。最後Gに抗う。

 sの総和が奇数のときは明らか不可能。総和が偶数の場合を考えれば良い。

CleyLが Nが奇数なら可能であることを主張。それを聞いて書く。

 Nが偶数のときは sを並び替えれば奇数の場合に帰着できる。並び替え方はdpをして復元すると言われた。それを書く。バグる。タイムアップ。ごめんなさい!!!

問題毎の感想

  • AB: Bがだるそう。ABをいつもノーペナで通してくれるCleyLには頭があがりません。
  • C: 思考停止せず算数解を考えて良かったと思う
  • D: どう実装するのが楽なんだろう
  • E: 構築は丸投げ定期
  • F: Abeshiはコインとボールがぶつかる判定をextgcdに帰着させていた。
  • G: 構築は丸投げ定期

総括

(https://icpc-replay.vercel.app/chart?contest=2024_domestic&team=Spinning-akabeko より)

  • 良い成績。selected 25↑を達成できたのが特に嬉しい。
  • 自分がGをバグらせなければギリギリ間に合って7完ありえたのかなぁ...。たられば言ってもしょうが無いか。
  • 三人それぞれがチームに貢献できた3時間だったと思う。
  • 難易度感が模擬国とほぼ同じだったと思う。JAGありがとう.....
  • SkyBlaze(同学チーム)には届かなかった。9位って凄すぎる。誇らしいやら悔しいやら。

国内予選を終えて

良い成績を出せたのは確かだけど、戦略・コミュニケーションをもっと練ればさらに良い成績を目指せたと思う。横浜までもっと鍛える。

個人としては、典型大臣再就任できる様にABCやECRをがんばります。本当かな。口だけかもしれない。

*1: 箱根駅伝dp とか 分割統治でdpが高速化できるタイプの問題 に触れました。

*2:今年からライブラリがokになることも踏まえて、簡単目の幾何が出題されたら例年より多くのチームが通してくると予想していました。解けなかったら悲惨なので練習!

ECR150-F Monocarp and a Strategic Game

問題

https://codeforces.com/contest/1841/problem/F (diff: 2700)

街には人間、オーク、エルフ、ドワーフ 4つの種族が住む予定だ。始め街には誰もいない。

 N個の移住プランが与えられる。 i個目の移住プランは人間、オーク、エルフ、ドワーフがそれぞれ a_{i}, b_{i}, c_{i}, d_{i}人移住しようとしている。あなたはこの人達を全員受け入れるか拒否するかを決定する。

街の幸福度を (人間の数 - オークの数)^{2} + (エルフの数 - ドワーフの数)^{2}とする。幸福度としてありうる最大値を求めよ。

制約

  •  1\ \le\ n\ \le\ 3\times 10^{5}
  •  1\ \le\ a_{i}\ \le\ 10^{9} (他も同様)
  • TL1秒
続きを読む

ECR150-E Fill the Matrix

問題

https://codeforces.com/contest/1841/problem/E (diff: 2200)

 n n列の行列がある。始め i列目の 1行目から a_{i}行目のマスは黒く、 a_{i + 1}行目から n行目のマスは白く塗られている。各マスには値が決められていない。

あなたは、この行列から m個のマスを選んで 1から mの値を割り当てる。

 (i, j) kが、 (i, j + 1) k + 1が割り当てられるような kの数は最大で何個になり得るか求めよ

制約

  •  1\ \le\ n\ \le\ 2\times 10^{5}
  •  mは白マスの数を超えない
続きを読む

ECR150-D Pairs of Segments

問題

Problem - D - Codeforces (diff: 2000)

区間の列  ( (L_{1}, R_{1}), (L_{2}, R_{2}), \dots, (L_{n}, R_{n}) )は次の条件を満たすとき、またそのときに限り「良い列」と呼ぶことにする。

  •  nが偶数
  • 共通区間を持つ要素同士に辺を張ったグラフを考えると、これが各連結成分のサイズが 2 \frac{n}{2}個の連結成分になる

 n個の区間を与える。最小何個の区間を消去すれば良い列にすることが可能か求めよ

制約

  •  2\ \le\ n\ \le 2000
  •  0\ \le L\ \le\ R\ \le\ 10^{9}
続きを読む

ECR151-E Boxes and Balls

問題

https://codeforces.com/contest/1845/problem/E (diff: 2500)

 N個の箱が横一列に並んでおり、各箱は空 a_{i} = 0またはボールが一個入っている a_{i} = 1。あなたは以下の操作を丁度 K回行う。

操作: ボールが入っている箱と空箱を一つ選ぶ。これらは隣接している必要がある。選んだ箱に入っているボールを空箱に移す。

操作後の箱の状態についてあり得る通り数 \mod 1000000007を求めよ。

制約

  •  2\ \le\ N\ \le\ 1500
  •  1\ \le\ K\ \le\ 1500
続きを読む

ECR152-F XOR Partition

問題

https://codeforces.com/contest/1849/problem/F (diff 2700)

非負整数の集合 Sに対して、 Sのスコアを Sの相異なる二要素のxorとしてあり得る最小値とする。ただし、 |S| = 1の場合スコアは 2^{30}とする。

相異なる N個の整数 a_{1}, a_{2}, \dots, a_{N}を与える。二つの空集合 S, Tを用意し、各 a_{i}をどちらか片方に挿入する。 \min(Sのスコア, Tのスコア)としてあり得る最大値を達成する操作方法を一つ求めよ

制約

  •  2\ \le\ N\ \le\ 2\times 10^{5}
  •  0\ \le\ a_{i}\ \lt\ 2^{30}
  • TL7.5秒
続きを読む