ABC323

6完。簡単なことしかしてない。競プロしてるとき頭がもやもやする感覚はずっとある。

A - Weak Beats

考察がむずくないか。奇数番目は関係ない。すべて0というのは、0でないものが一つでもあるかを確認すればわかる。

B - Round-Robin Tournament

勝ち数が同じとき直接対決で決めるとかじゃなくて優しい(いや直対使ったら三つ巴があるやんけ)。単に数えてstable_sortすればいい。

C - World Tour Finals

重実装BをCに置くのやめてくれ。やるだけではあるが、最大値は毎回求める必要があるし(計算量は考えなくていいので左右から累積maxとかする意味もない)、残ったやつを大きい順に使うのも簡単ではあるが長い。

D - Merge Slimes

素因数を見て2とそれ以外に分ける。2以外の部分で分類すれば、これは干渉し合わない。独立に考えることができる。unordered_mapにvectorを突っ込む。証明はしていないが、サイズが2冪だけとすれば2進法の表現を考えれば小さいほうから貪欲でよさそう。何匹いるかは、毎回半分になるので元の最大値の2倍までは行かない(intに収まる)。サイズは10^9*10^9くらいだから2^60に達することはない(と思っていたけどなんかもやもやして明快にはわからず、今考えると総サイズは余裕で超えてくるが大丈夫みたいな感じか)。分類したものは、それぞれソートというか60個の箱に振り分けて小さいほうからやっていく。

priority_queueを使う方法でもやってみたが、こんなに遅くなるとは思わなかった。これlogが2個付いてんだね。今回は10^5しかないので余裕だけど、知らずにlogが余計に入ってることあるからちゃんとやらないと怖い。

E - Playlist

簡単そうに見えて、けっこう時間かかった。各時刻についてそこで曲が始まる確率をDPで求める。小さいほうから配っていけば不思議なことに被らない(なんか確率1超えることがありそうな気がしてしまった)。除算はforの外でやっておく。あとは、曲1がそこで開始して時刻Xを超えて再生される場所で足していく。

F - Push and Carry

やりたくねえと思ったけどGが難しそうなのでやるしかない。順位表を見てその程度の方針で。荷物が原点にあり行き先は右上にあるとしてよい。同じ向きに押し続けることを1回と数えると高々2回でよさそう。するとどっち向きに先に押すかを2通り試せばよさそう。移動で遠回りが必要になるのは、行き先が陰になっているときだけだろう。0回押すことをしないように注意する。実装。途中、xとyの書き間違いがあって怖い。位置を実際に変更しながらやっていたので、2回目で位置が最初から合っていてそのバグを見つけるのに少し時間を使った。