ICPC Taichung Regional 2025 参加記
University of Aizuからaizu_3としてICPC Taichung Regional 2025に参加しました。
メンバー
- uryo1903(私) - ABC+データ構造担当
- nyuminyusupe - ARC+実装担当
- achapi - ARC+数学担当
Day0
福島空港から台湾へ。初めての飛行機でテンションが上がった。
台湾の交通事情に精通していない場合、新幹線の予約はあまりお勧めしない。駅までたどり着くのが大変なので。
Day1
この日はRegistrationとPractice Session。後ろにはbonsai、向かいの席はPCkomachiでした。PCkomachiとPCKのマスコット、少し面白かったです。

ラストイヤーだし記念に参加するつもりだったがaizu_Cからplayoff狙えるという話を聞かされ衝撃を受けた。もうすこしちゃんと準備してくればよかったな~っと思ったが時すでにおすし。
Day2
本番。ここからは問題のネタバレを含むので注意。
コンテスト
言語:C++
エディタ:Vim
難易度が分からないのでとりあえずnyuminyusupeが環境構築をする間にachapiが先頭から、私が後半から読むことに。問題文はチームで1部なのでホッチキスを外す。
環境構築中にachapiがA,Bの読解を終わらせ、Aは簡単らしいので実装してもらいAC(0:10)
Bの内容を聞くが重実装しか思いつかず一旦置いておく
Mが解かれているので読むと幅優先探索をするだけなのでnyuminyusupeに投げるとACが返ってくる(0:28)
Eもやるだけだったのでachapiが実装しAC(0:38)
achapiがFをエスパーで実装したがWA、考察を続けてもらいAC(0:59)
nyuminyusupeにBを見てもらうとバスに乗るの1回だけじゃね?って言われたがまだ実装がダルそうなので投げるとACが返ってきた(1:13)
I,Jを見るとJが実装が難しそうだが雰囲気をつかめたので私が担当し、Iは幾何なのでachapiとnyuminyusupeが担当することに
IとJを交代で実装しているとIの誤読が判明する
Iははじめ尺取りとか言っていたが、Jの実装中に凸包を用いた解法が降りてきたので凸包と叫ぶと肯定的な返事が返ってくる
凸包のライブラリは持ってきたがcross()の中身が書いておらずnyuminyusupeと二人でライブラリを隅から隅まで探すが見つからない
絶望しながらJをAC(2:19)
cross()は気合で捻出してもらうことになりachapiがI担当に
解かれているK,Lを見ると、Kはヤバに見えて実は全探索できる制約であることに気づきnyuminyusupeに投げる
LはARC-Likeな見た目をしているが無理やり良さげな性質をエスパーしDPに落とし込めそうだと考察し私が担当することに
そうこうしている間にIのサンプルが合いAC(3:24)
Lの実装を始めると簡単なDPの組み合わせなのですんなり実装が終わりAC(3:53)
ここでKの実装に入る
時間的にも順位的にもKが解ければいい感じだが念のためachapiにHの考察を進めてもらう
何度かつまずくもののサンプルが合いAC(4:21)
ここでなんとHの考察が終わってるらしくHの実装を進めてもらう
サンプルが合わないようで聞くと解法が破綻していることに気づく
何かいい性質かゴリ押し法を考える必要がありそうだがここで時間終了
結果

9完 14位 Silver Award
日本チーム中でもbonsaiに次ぐ2位と練習時からは考えられない順位を取ることができた。playoff行きも濃厚らしい?
Iに時間かかってなければワンチャンもう1問あったかもしれない。
夜
他の日本チームに連れられ夜市へ。
まずは宮原眼科で大きなアイスを食べた。とても美味しかったが普段こんなに甘いものを食べないので途中で少し気持ち悪くなってきてしまった。
夜市では大きな唐揚げを食べることができたがビールを扱っている店が無かったのが少し残念。どうも日本ほど飲む文化が無いらしい。臭豆腐は本当に掛川花鳥園の臭いでびっくりした。playoffの時に食べると言い回避。
Day3
三日目は運営主催の観光バスツアーだった。殆どが台湾の歴史に関するもので、疲れもあり正直途中で飽きてしまった。昼は尋常ではない量の料理が提供された。日本のもったいない精神はあっけなく敗北。
最後に
ライブラリはちゃんと準備しよう。せめて読もう。もしplayoff行き確定したらちゃんと準備します。
JAGの夏合宿ではそれはもう散々な結果でどうなることかと思ったが何とか形にすることができました。勝因はコンテスト中のコミュニケーションを大切にしたことですかね。
台湾で色々話しかけてくださった皆さんありがとうございました。
担当した問題について(11/22追記)
J Sliding Tiles
愚直にシミュレーションをするとになるが、同じ値のところはまとめて計算したい。値が変わる可能性のあるのはタイルの上端と壁の上端。ここを次の壁の分割点として用いると、分割される回数は
となって間に合う。区間加算一点取得が必要になるのでBITを用いる。
実装例(本番もほぼ同じコードを書いた)https://codeforces.com/contest/2172/submission/350021754
L Maximum Color Segment
端だけに注目すると添え字で独立に考えれることが分かる。一度の操作でスコアが-2~+2変化し前後の操作に影響するので、
番目までで操作回数
で
がtrueなら直前に操作している場合の最大のスコアでDP(
)を
回独立に行う。(操作回数,スコア)のペア(スコアが同じ場合は操作回数のminを取る)が
個ずつ得られるのでこれでナップサックDPをする。
実装例(高速化のため添え字を入れ替えてます)
https://codeforces.com/contest/2172/submission/350687034
HOJ 1306 - よんかくけい
問題概要
二次元座標平面上につの点
がある。
点の座標は
、点
の座標は
、点
の座標は
、点
の座標は
である。
この点を結ぶ四角形の面積を求めよ。なお、四角形の面積は整数となることが保証される。
制約
- 四角形の面積が整数とならないような入力は与えられない
解説
点の
座標は共に
なので、
軸で上下
つの三角形に分割することができます。 よってそれぞれの面積を求めて足した結果を出力すればよいのですが、計算途中の面積が整数とならない場合があるため除算は最後に行いましょう。
HOJ 1527 - Colorful Tree
問題概要
頂点の木があり、頂点
は色
で塗られている。
以下のようなクエリが回にわたって与えられる。順に処理せよ。
- 頂点
の色を
に変更し、頂点
に直接繋がっている頂点の色の種類数を出力する。
制約
解説
まず木を頂点を根とした根付き木として見ます。
次に各頂点について、「現在の色」、「親の頂点番号」、「親の色」、「直接つながっている頂点の{色:個数}の連想配列」を用意します。このとき、連想配列のサイズが答えるべき色の種類数です。
更新処理をする際、隣接する頂点をすべて見てしまうとTLEになってしまいます。そのため、親に対してのみ更新を行うことにします。
各頂点について、子の頂点の色が更新された場合はその時に更新されるため問題ないです。親の頂点が更新された場合は、自分の知っている親の色と実際の親の色が異なる場合連想配列の値を更新します。
このように更新処理を行うことでクエリ当たりで処理を行うことができます。
よってこの問題はで解くことができました。
HOJ 1528 - Monochrome Balls
問題概要
個のボールが横一列に並んでおり、始めすべてのボールは白く塗られている。
以下のような個のクエリが与えられる。
- 左から
番目のボールを黒く塗る
各クエリ後のボールについて、白く塗られたボールが連続して最大何個並んでいるか求めよ。
制約
解説
連続した白いボールをUnionFindで管理したくなりますが、UnionFindでは削除するという処理ができません。
そこで、クエリをすべて処理し終えた状態から始め、各クエリを逆に処理していきます。
すべて処理し終えた状態においての答えは簡単に求めることができ、クエリは黒く塗られたボールを白く塗りなおす処理とすることができるのでUnionFindで処理が可能です。
よってこの問題は計算量で解くことが出来ました。
※はアッカーマン関数の逆関数