ABC152

全完!これは気持ちいい(内容がよかった)。昨日よりはいい精神状態で臨めて立ち回りもよかった(面倒そうなDを後回しにして最後すっきりした解法を見つけた)。窓を開けて換気したりもした。

A - AC or WA

ACの場合はYesなので、n == m ? "Yes" : "No"。逆だったら、m < n ? "Yes" : "No"とするつもりだった。

B - Comparing Strings

罠がありそうで怖い見た目してるけど、先頭の数が小さいほうが辞書順で小さいので、小さいほうの数を大きいほうの数だけ出力する。

C - Low Elements

不等号の向きがややこしいな。自分も含めてるけど、含めずに(添え字が小さいほうから見ていって)「これまでで最小のもの」ってのが何個あるか。最大か最小を更新していって比較するだけだね。で、最大と最小どっちだい。「これまでで最小のものよりさらに小さい」だから最小値だ。チキンなので含める書き方にしてしまった(最小値を更新してからの比較)。

D - Handstand 2

とりあえず場合分け1桁のときは同じ数同士でつながれる。2桁以上のときは81通りあって、4桁の数なら端以外で100通りある。さて、N=3214とかだとどうするか。その100通りの途中で切られるのがきつい。桁DPの問題みたいに、3000までと3200までと3210までとって分ければいいのかな。できるかもわからんし、だいいちやりたくねえ。ということでさっさとE問題に行った。

EFを解いて帰ってきた。時間が経っているからか違う発想が出てくれた。桁数関係なくiで始まりjで終わる数をカウントすればいい。0で終わる数は数えないように気をつける(今気づいたけど0で始まる数がないからカウントしてもよかった)。あとはp[i][j] * p[j][i]を足し上げるだけ。後回しにしてきれいな解法思いついて全完。最高のムーブだった。

E - Flatten

要するに積が全部同じ数になる。まあA全部の積をA_iで割ったものをB_iにすればいいよね。あとは最大公約数で割るとかすれば最小が求まる。よーするにAの最小公倍数がmod Pで求まればいい。実際、単にmodを取らず最小公倍数を求めるだけでサンプルは通った。さて、mod Pで最大公約数が求まるか!?(そこを問われていると思って緊張が走った)

しばらく考えてたけどさすがに無理でしょ。いやなんかA_iは10^9+7の倍数じゃないから行けるかもと思っちゃった。1と10^9+8が全然違う数なわけでね。ここでようやく、Nが小さい制約になってる理由に気づく。素因数分解して最小公倍数を求めるんだ。各素因数について最大何個あったか更新していく。試し割りは10^6まですると素数だけでも間に合わなそうなので、ここは10^3までやって残ったらそれは素数ってことでいいんだけど、そうなるとそのでかい素数が何番目かわからんので(別に二分探索やmapで間に合うだろうけど)困った。ここで、A_iが小さい制約になってる理由に気づく。10^6サイズの配列を用意しちゃえばいいんだ。A_iが小さいから素数以外まで含めても余裕がある。ということで実装。最小公倍数を求めるパートがやや複雑で不安だったがなんとか一発AC。

F - Tree and Constraints

Nが小さいが、Mが20以下とほんとに小さい。2^Mができる。否定を考えると「1個でも全部白なパスがある」になる。これは包除が使えるか!?使ったことなかったけどここでわかりやすい典型で出してくれたか!実際そうだった。包除原理の実装の勉強ができて嬉しい。Nも50以下で、64以下なので辺の選び方がビットで表現できる。

つまり、まずDFSでuからvへのパスを求め、パスに使われている辺のビットを立てる。これで条件が1個の64bit整数になった。DFSは、目的地に着いたらフラグをセットして、フラグが立っていたら使った辺の辺番号のビットを立ててすぐループを抜ける(帰りがけにセットする)(他の辺を探索しない)。辺が辺番号を持つことが必要だった。ビットを立てるときシフトを忘れてサンプル合わなかったりした。次に、条件の選び方2^M通りについて、選んだ条件たちの全部白でなければならない辺の和集合をビット毎のORで求める。そこが全部白で、他は白黒どっちでもいいので2の他の辺の数乗通り。これを包除の公式通りに足していく(競プロ的だ)。popcntがけっこう重そう(N-1ビット毎回数える)だと思ったけど、実行時間制限が4秒なので安心。

サンプルでデバッグして合ったら提出。条件を64bit整数にしたものを保存するときintの配列に入れてしまっていて1WA。最近、WAを出すのが怖くて固くなっていた気がするので、軽い振る舞いを心がけていた。結果的に1ペナだけでスピード出せてたので満足。まあ、変なWAを出したらダメージあるんだろうなあとか思いながらジャッジを待ったりしてたけどw