ABC270

6完。調子はよかった。Fまで早解きできる得意セットだったみたい。Gに時間を残せたのに難しくてまるっきり足りない。Gで相当頭が疲れた。悔しいけど勉強になるのでよかったね。

tokuminiさんと隣の順位。見直ししなければ勝ってたなあとか言える非常にレアな状況。

A - 1-2-4 Test

「少なくとも一方」を読むのに少し時間がかかった。点数はビット被りがないので、ORだ。何と何が対応しているからみたいな思考がけっこう深くて大変だった。1分切れてよかった。

B - Hammer

けっこう難しいけどこのくらいなら俺でもわかるよ。まず、壁の位置を固定したい。Yが負ならX,Y,Zそれぞれに-1を掛ける。「普通に行けるけどハンマーを使ってショートカットできる」みたいなことはないので、XとYを比較してハンマーが要らないなら単にXまでの距離、そうでないならZとYを比較してハンマーが取れるならZまでの距離とZからXまでの距離の和、そうでないなら到達できない。いいテンポで解けた。

C - Simple path

さすがにやるだけ。どう実装するのが楽だったんだろうね。普通にXからDFSしてYを見つけたらそこからは他を探索せず戻るたびに頂点をpushしていき最後にreverseして出力とした。あー普通にスタックトレース(と呼ぶのはおかしいか)持つのでもよかったな。

D - Stones

A_1=1という制約にギョッとするが、それによって石を取り切ることが常に可能なのが自明になっている(あまり意識してなかったが零和じゃなかったら大変なことになりそう)。Nが小さいので簡単にDPできる。i個の石からスタートしたときの先手のスコアでDP。自分より小さいところは全部求まっているとして、全部の合法手に対してスコアを求める。i個の中からA_j個の石を取って残りs個になった相手のスコアがdp[s]で、じゃあ自分のスコアはA_j+(i-A_j-dp[s])とかやってたけどこれは要するにi-dp[s]で、i個の中から相手に取られるのがdp[s]個だからそりゃそうだ。

E - Apple Baskets on Circle

右隣というのがわかりづらい。高橋君が円の内側にいてかごが時計回りに並んでいるイメージで落ち着いたけど、これは外側にいて反時計回りでもいいし仮に上から見てたら円の奥と手前で左右が逆になってしまう。まあ、円はすぐに切り開いて線にしてしまうのだけど。

かなり怖い見た目だが、そこまでではなかった。最初に山の上だけ切り取るような図を描いていたが、それは間違ったイメージで実際には逆さにした山の上だけを切り取る。二分探索できる。数が大きいのでシミュレーションは間に合わないが、終わるギリギリまでシミュレーションを進めてもらう。1周単位で考える。一番多く取ったかごからX個取ったときに、全体で何個取ったかを求めて、それがK以下になる最大のXを求める(K以下にならない最小のXを求めて1を引く)。X周した状態が求まったら普通にシミュレーション(必ず1周で終わる)。

F - Transportation

まあ最小全域木。空港と港がわからないが、2種類あるってことは1種類ならそこそこ簡単ってことか?と思い、港はないものとしてまず考えてみる。超頂点を追加するような考え方でできたらいいけどできないよなとか思いながら考えると、できる。空港に対応する頂点を1個追加して、空港を建設することはそこと双方向に結ぶ道路を作るのと同じことに「空港を使うと仮定すると」なる。港もあわせて4通りやればいい。UnionFindで、使う頂点数から1引いた数だけ結合したら終わり(使わない頂点と結ぶ辺は無視する)。全域木ができてなくても最小コストを更新していてサンプルに助けられた。

G - Sequence in mod P

「Baby-step giant-step」の名前がなかなか思い出せなかった。brother big young などの単語で競プロ関係をググっていたが、giantを思いついてそこからすぐわかった。イメージはかなりぼやけているけどたぶん実装経験もあるし行けそう。(int)sqrt(P)回操作した値を知るのが難しいと思ったが、行列累乗で行ける(不思議な感じする)。S=GやA=0は場合分けするとして、他はP-1の周期を持つ気がするから甘えも利きそう(終了後気づいたがサンプルにA=1という反例あり)。逆元が難しそうなのでゴールからBaby-stepで当たるのを探す。それは必要条件でしかないので行列累乗で実際にその回数でその値になるか確認する。アイデア自体はシンプルなのに難しくて時間がどんどん過ぎる。とりあえず5分前に書きあがって、これが正解だとは思っていないがサンプルくらいは通ると思って実行したら全くできてない。このやり方だと周期が1個前だったりとかするんだな。周期は全てP-1と言えるだろうか。そもそも、A=3,B=P-2,S=1みたいなのもあると気づいてなかった。

(追記)A=0のケースを先に処理しているので、逆元が普通にあった(なぜ気づかない)。A!=0なら合流はないんだね。あとは普通にBaby-step giant-step。周期が短い場合がないか不安だが、どちらのstepも回数が少ない順にやっているので、被ったら/見つかったらそこで抜けるだけでよさそう。ねむかったけどAC(ACしてしまえばACなのフルコンみがある)。コンテスト中、なんかずらすことでBを消せないかみたいなことを思っていたが、解説の別解に書いてあった。高校でやる漸化式まんまじゃん。競プロ文脈だと思いつけなくなるのクソいなあ。