2020年6月6日土曜日

AtCoder Beginner Contest 158

 時間ギリギリで全完。

コンテストへのリンク


D - String Formation

一々文字列を反転させていたら時間がかかってしまうので、反転は最後にまとめて行い、文字列追加の際、反転の回数が偶数なら後ろに、奇数なら前に追加する。
 先頭への文字の追加は、Pythonならcollections.dequeを使う。

E - Divisible Substring

 各桁に注目して、たとえば1234という四桁の数字を

4+3*10+2*10^2+1*10^3

 に分けて考える、というのはよくあるテクニック。
 この要領で、1桁目~各桁までの値をPに関する剰余で分類し、それが一致している範囲を求める。

 ただし、P=2や5のときに気を付けなくてはいけないことに注意。これらは10と互いに素でないので、この方法では上手くいかないため、例外処理しなくてはいけない。

 コンテスト中はこれに気付かずWAを出した後、全探索のコードを書いて比較することで気付けた。
 結構気付きにくいようにも思うので、上手くリカバーできて良かった。

F - Removing Robots

 とりあえずソート。

 すると、「そのロボットを起動させたとき、どのロボットまで連動して起動するか」が分かればDPで答えを求められそう、と分かる。
 なので、それをセグメント木を用いて求めていく。


0 件のコメント:

コメントを投稿