ABC158 参加メモ
atcoder.jp
E、めちゃくちゃ難しくないか?
1905 -> 1936(+31 Highest) Perf=2180 でした いい感じだね
A - Station and Bus
差がなければだめ AAA か BBBが "No", ほかは "Yes"B - Count Balls
なんか、(A+B)で周期が来るので、最後のところでどのくらいAを入れられるかを考えるとACするC - Tax Increase
から くらいまで全探索します 見つけたら出して終わり 見つけられなかったら -1D - String Formation
反転をしなくても、反転したことにできるので、フラグを持っておいて、適切に処理しますE - Divisible Substring
これ難しい位置 からのsuffixを持った数字を とすると、 位置 から位置 までの文字列の数字は、 になる。これがわり切れるかどうかを見れば良い。
ところで、 と が互いに素であれば、 が割り切れることと、 が割り切れることが同値になる。
は倍数になっているので明らか。
は ある が で割り切れないとき、 も割り切れないことから( が互いに素であると、 法 上の は にはならないため を何度かけても で割り切れない)、対偶を取ると、証明できる。
このようにすると、 を満たしていればよく、しかもこれは式変形をすると、 であるため、 等しいペアを見つける問題に落とされるので、 ある値 が何個あるのかを保存しておきながら見ていくことで、 で解ける( が大きいと mapを使って で解くと思う)。
ところが、互いに素ではない については、 先ほどの条件の を満たさないことから、上の解法では解けない。
しかし、 はそもそも、末尾の桁が で割り切れればいいので、 割り切れるものを見つけたら、すぐにそのインデックスである を足せばいいので、簡単に処理できる。
F - Removing Robots
あるロボットが動くと、どのロボットが動いてしまうかということを考える。これは再帰的に繰り返されるので、再帰の終端点からボトムアップに処理していくと良い。
あるロボット が動くことによって、 ロボット が動く時、 ロボット が最終的にどのロボットまで動かすかが分かっていればいい。
しかも、 であるので、 これは後ろからDP をすることで解くことが出来る。
すると、このような漸化式になる。
より位置が小さい一番右のロボットは しゃくとりとか lower_bound とかですぐ求まる。
そして、 であるような ロボット は連続しているので、この遷移は、 を求めるSegment Tree で で処理できる。
このDPを処理できれば、場合の数を求めればよいが、これも簡単なDPで求められる。
ロボットを使う/使わないで分けて、 使うときは、影響しない一番左のindexを から参照して遷移、 使わない時は、 に遷移するようにしてやれば、 でこの問題を解くことが出来る。
ソース
A - https://atcoder.jp/contests/abc158/submissions/10588365B - https://atcoder.jp/contests/abc158/submissions/10592194
C - https://atcoder.jp/contests/abc158/submissions/10595267
D - https://atcoder.jp/contests/abc158/submissions/10600188
E - https://atcoder.jp/contests/abc158/submissions/10663351
F - https://atcoder.jp/contests/abc158/submissions/10623204
感想
Eの考察、これはかなり面白いと思う。 こういう系の問題に会ったことがなかったから考察を結構しないと解けなかった。ちゃんと数式を出さないとこういうのは厳しいね (かなり非自明な感じもするし)