3匹の猫

みみねこの競プロ精進メモ

AtCoder Beginner Contest 199(Sponsored by Panasonic)参加記(~C問題)

早解きしかできなかった
f:id:mmnkblog:20210424224915p:plain

A - Square Inequality

こういう、一見そのまま解くだけに見える問題を素直に実装すると、たいてい何らかの罠にはまる。たとえば、

  • 愚直に計算すると実行時間制限に間に合わない
  • 計算途中でオーバーフローする
  • 割り算や平方根の計算時に小数の誤差が発生する
  • コーナーケースが存在する(0除算など)

などが考えられる。今回は上記のどれにも当てはまらないので、単純に不等式評価を行うだけ。A問題なのでこれでACできる。
計算量はO(1)

B - Intersection

xの候補の最小値はA_{\min}、最大値はB_{\max}であるので、解xを全探索して条件を満たすかどうか全探索してカウントする。
計算量はO(N B_{\max})

ちなみに、別解が存在する。条件式より、解xの範囲はA_{\max}\le x \le B_{\min}となる。逆に、この範囲にある整数xはすべて条件を満たすので、答えはB_{\min} - A_{\max} + 1となる。
こちらの計算量はO(N)で、はじめの解法より高速。

C - IPFL

これは、先ほど挙げた罠のうち、「愚直に計算すると実行時間制限に間に合わない」問題。というか競プロの問題の9割がこれである。
クエリの数が最大で3\times 10^5個あるため、各クエリに対して高速に回答する必要がある。
クエリ1では、文字を交換するだけなので、計算量はO(1)である。
クエリ2では、長さNの文字列を交換するので、計算量はO(N)である。
なので例えば、すべてのクエリがクエリ2だった場合などを考えると、愚直な解法の計算量はO(NQ)となってしまいTLEする。

ところで、クエリ2を偶数回連続で処理すると元の文字列に戻る。連続で処理しなくても、クエリ1で操作されなかった文字S_iに関しては、クエリ2が偶数回処理されれば元の位置iに、奇数回処理されれば位置(i+N)\bmod {2N}に移動することがわかる。さらに、クエリ2を奇数回処理したあとにクエリ1を処理するのは、クエリ2での反転を一度無視して、クエリ1で与えられた値A, Bに対して文字S_{(A+N)\bmod {2N}}, S_{(B+N)\bmod {2N}}を交換した後にクエリ2を処理するのと同じである。
つまり、クエリ2は最後に一度だけ処理すればよく、クエリ1を処理する時点での「本来何回クエリ2を処理しているか」がわかれば、全体としてO(N+Q)の計算量で全てのクエリを処理できる。

感想

Dが難しかった