AtCoder Beginner Contest 174の感想
100-200-300-400-500-0で0ペナ5完1500点。
A - Air Conditioner
が以上かどうかで条件分岐したいので、if文を用いて実装する。計算量は。
B - Distance
個ある点それぞれについて、「原点からの距離が以下か?」という質問に答える。原点からの距離が以下であるような点がいくつあるかを記憶する変数を一つ作ると実装しやすい。今回のA問題のような判定を回繰り返すイメージ。
計算量は。
C - Repsept
説明のため、問題文で与えられたというような数列を、が個続く数をとする。このときの第項はである。
数列について、第項の数から第項の数へ遷移する方法を考える。これは、
- を倍して
- それにを足す
とすれば良いことがわかる。「を足す」とも解釈できるが、上記の方法は変数に寄らず一意に表現できるので何かと都合が良い。
さて、今回はがの倍数かどうか知りたいが、初項から順番にで割って行って割り切れるかどうか見る方法をとると、途中での値がオーバーフローしてしまう可能性がある(Pythonなどでも計算速度が非常に遅くなりTLEする可能性が高い)。ここで、今回は「をで割った余り」がいくつなのかわかれば十分であるので、先ほどの遷移式に
- で割った余りをとる
という操作を追加する。この操作を追加しても正しい値が求まることは剰余算の性質よりわかる(わからない場合は検索してみてください)。
あとは、で割った余りがとなるようなが存在しないとき、第何項まで見れば良いのかという問題がある。ところで、先ほどの遷移方法を見ると、とをそれぞれで割った時の余りが等しければ、とは等しくなることがわかる(ここで「変数に寄らず一意に表現」した恩恵が来る)。よって、あるについて計算した余りが今までに登場していたところで探索を打ち切ればよい。もっと言えば、鳩ノ巣原理より、「をで割った余り」を鳩、「以上未満の整数」を鳩ノ巣と見れば、高々第項までみれば良いことがわかる。
計算量は。
D - Alter Altar
「石を個選び、それらを入れ替える」という操作は、「石を個選び、石の色を変える」という操作を回行ったのと同値なので、できれば石を入れ替える操作を優先して行いたい。最小手数を考えることは一度置いておく。石を入れ替える操作のみで、文字列の中でWR
という連続部分文字列が存在しないようにするためには、WR
という連続部分文字列を見つけたらそれをRW
に置換すればよい。この操作を繰り返すと、最終的にRRR...WWW
という文字列に落ち着くことがわかる。逆に、この形式の文字列は問題の条件を満たす。
よって、文字列中のR
の個数をとすると、先頭から文字目までの中でW
という文字はいくつあるかを数えれば、それがそのまま答えとなる(そのW
を後半のR
と入れ替える操作を行えばよい)。計算量は。
E - Logs
長さの丸太に対して、切った後の長さがそれぞれ以下となるように切るのに必要な切る回数の最小値はで求められる。もしが固定されているなら、本の丸太全てに対して上記の計算をすることで丸太の長さを以下にするために必要な切る回数の最小値がわかる。あとはを以上の範囲で二分探索して解を求めればよい。計算量は。
F - Range Set Query
解法はあっていたが実装で躓いてしまった。詳しいことは後日追記します。ネムイ
5完までのスピードは速かったが、問題の難易度が全体的に易しめだったせいかパフォはそこまで高くなかった。