ARC150

3完。いい立ち回りをしてようやく黄パフォにギリ引っかかる。ABCでもARCでも黄パフォの難易度は変わらないはずだけどなー(厳密には(得意不得意抜きにしても)上位がunratedなぶん少し変わる(rated最上位が有利になってそのぶん下が少し難しくなる)らしい)。例えば、ぷよぷよで同じくらいの実力の人と連戦したとして、そしたら各試合どっちかが勝つんだけど、勝った側は「ここまでやってようやく勝てるのか」と思う。ちょうどそういう感じ。

A - Continuous 1

6分くらい考えて何も見えない(頭が動いている感じがしない)ので飛ばした。

BCを通してDが難しそうなので戻ってきた。Yesであるものに対して、ちょうど1通りであることを仮定したら何かでてこないかを考えた。結局それはハズレだったんだけど、1になる区間を考えているうちに、その区間を1にして条件を満たすことができるかは区間内の0が0個かつ区間外の1が0個で判定できることに気づいた。これはしゃくとりみたくすれば簡単に全探索できる。実装はやや重いがなんとか書き上げてAC。

とにかく、このA問題で複雑な場合分けなどをして時間を浪費するのだけは避けなければならない。レーティングをエサにして集中力を得ている面はあるが、これはレーティングを犠牲にしてでも絶対に避けなければならない。ABCで酷い目に遭ってから、そのことは常に意識している。

B - Make Divisible

まず、Aを何倍かして(できるだけ小さい倍率で)B以上にする。Bを超えたぶんはYで調節する。この暫定解を基準に考えていく。倍率をこれより大きくするのは意味がない(Yが大きくなるだけ)。じゃあ倍率を1だけ小さくしたのも試せば答えか?いや、そうとも限らない。実際、サンプルが通らない。どこまで小さくすればいいかは思ったより難しい。式変形すると、Xは小さいほうがいいので、Yが非負になる最小のXを使うことになる。A=1, B=10^9とかを考えると、倍率はすごいが最初から倍数になっている(倍率が大きいときは解が小さい)。また、一つの観察として、Xは倍率が小さくなると大きくなっていく(単調増加)。ということで、Xが暫定解以上になったらそこで打ち切ることができる。他に何も見えない(そもそも式変形だけでしんどかった)ので、そのまま考えても得るものがなくペナルティ5分を受けたほうがいいと思い提出、AC。文章にしてみるとひどい。

整理すると、Aが大きいときは倍率が小さいので全部調べればいい。Aが小さいときは、なんかダメな気がするんだけど。わからん。解説も何言ってるのかわからん。残念な結果だ。

(追記)マルチテストケースなのに自分のコードに都合の悪いケースが1個も入ってなかったらしい(都合の悪いケースがばらけてたから助かったとかだと思ってたら全然違った)。3 1000000000でめっちゃ時間かかる(10個で6秒以上)。修正することを考える。そもそも答えはA未満なので、Aが小さいケースではXを全探索すればいい(小さい順に暫定解未満の間)。また、tokuminiさんのツイートを見てA+Xと(倍率)の小さいほうを全探索する方法でもACした。

C - Path and Subsequence

グラフが単純グラフだと書いてないので警戒するが、制約を見ると自己辺も多重辺もない。Aの情報は頂点に持たせてしまえばよい。頂点1からNへの単純パスは非常に多いので、DP的にまとめる必要がありそうだと思う。頂点1から考えていくと、部分列を作るにあたってBから貪欲に取っていっていいと気づく(逆にBの部分列がパスみたいに混乱してた気がする)。そうなると、Bのどこまで取ったかでまとめることができそうだ。ここで、単純パスでないパスを除外するのが難しそうで困ってしまったが、よく考えるとそういうパスは余計な経路を切り落とすことで単純パスにできる(単純パスが全てBを部分列に持つならそうでないパスはなおさら部分列を持っている)。最も都合の悪いケース、つまりBの要素を少なくしか取れていない経路を考えたい。各頂点について求めていく。なんとこれは最短経路問題だ。双対っぽくて難しそう。01BFSを使うことも考えたが、無難に使い慣れたダイクストラを貼った。辺のコストが動的に決まるやつだ。Bの最初と頂点1に対応するAの要素が同じならコスト1から始まる。これで、部分列をできるだけ短くしか持たない経路が求まる(ここはっきりとはわかってなかったな)。コストKならYes。

これでACとなったが、コストKを超えたときもYesとするのがコード上は自然でそれをどう解釈したらいいのか提出前に10秒くらい考えてわからなかった(連結なのでKを超えることはなく、関係は一応ないんだけど)。今考えると、単純パスが存在しないので任意の単純パスが条件を満たしており普通に判定できていた。

D - Removing Gacha

部分木に注目して考えていた。部分木の根が白なら全部わるい頂点。頂点1がよい頂点になった瞬間状況が変わるし、それまでにどれが塗られたかも引き継がれるので、どうしようもない。各頂点が塗られる回数とかも考えたけど、同じ理由でだめ。実験エスパーすべきだったかなあ。まあ愚直も脳内でやろうとしてできなかったので腕力も足りない。

前回のARCのDもそうだけど、このへんの解けない問題本当に世界が違うんだよな。実力向上のためには少しでも解説ACしたほうがいい(効果がある)とは思っているけど、それはそれとして自分の脳ではどうしようもないとも思っている。

(追記)最近気づいたけど、解説はすぐ見ていい。なぜなら解説を見てもわからないのでデメリットがほぼない。解説を見て「なんでこれに気づかなかったんだ」「惜しかったなあ」と思うことがない。

さて、各頂点についてその頂点がよい頂点になるまでのその頂点に対する操作回数の期待値を求める。その頂点に対する操作だけカウントすればいいので、根からその頂点までのパスだけから成る木で考えても同じ。更に、そのパス内ではわるい頂点だけでなく全ての頂点からランダムに選ぶとしても(よい頂点が選ばれたときはその頂点の色も対象頂点への操作回数も変わらないので)同じ(大胆すぎて理解に長時間を要した)。これはコンプガチャなので既知。「その頂点がよい頂点になるまでの」期待値を求めていたが、よい頂点になったあとは選ばれることがないのですべての頂点が黒になるまでの期待値と同じ(なんか長時間気づかなかった)。