AtCoder Beginner Contest 199(Sponsored by Panasonic)参加記(~C問題)
早解きしかできなかった
A - Square Inequality
こういう、一見そのまま解くだけに見える問題を素直に実装すると、たいてい何らかの罠にはまる。たとえば、
- 愚直に計算すると実行時間制限に間に合わない
- 計算途中でオーバーフローする
- 割り算や平方根の計算時に小数の誤差が発生する
- コーナーケースが存在する(0除算など)
などが考えられる。今回は上記のどれにも当てはまらないので、単純に不等式評価を行うだけ。A問題なのでこれでACできる。
計算量は。
B - Intersection
解の候補の最小値は、最大値はであるので、解を全探索して条件を満たすかどうか全探索してカウントする。
計算量は。
ちなみに、別解が存在する。条件式より、解の範囲はとなる。逆に、この範囲にある整数はすべて条件を満たすので、答えはとなる。
こちらの計算量はで、はじめの解法より高速。
C - IPFL
これは、先ほど挙げた罠のうち、「愚直に計算すると実行時間制限に間に合わない」問題。というか競プロの問題の9割がこれである。
クエリの数が最大で個あるため、各クエリに対して高速に回答する必要がある。
クエリでは、文字を交換するだけなので、計算量はである。
クエリでは、長さの文字列を交換するので、計算量はである。
なので例えば、すべてのクエリがクエリだった場合などを考えると、愚直な解法の計算量はとなってしまいTLEする。
ところで、クエリを偶数回連続で処理すると元の文字列に戻る。連続で処理しなくても、クエリで操作されなかった文字に関しては、クエリが偶数回処理されれば元の位置に、奇数回処理されれば位置に移動することがわかる。さらに、クエリを奇数回処理したあとにクエリを処理するのは、クエリでの反転を一度無視して、クエリで与えられた値に対して文字を交換した後にクエリを処理するのと同じである。
つまり、クエリは最後に一度だけ処理すればよく、クエリを処理する時点での「本来何回クエリを処理しているか」がわかれば、全体としての計算量で全てのクエリを処理できる。
感想
Dが難しかった