Official

C - Rotation Editorial by PCTprobability


便宜上、\(S\) を 0-indexed として扱います。

\(S\) の末尾の文字を削除し、先頭に挿入する」という操作を x 回連続で行うことを愚直にやっていては計算量が \(\mathrm{O}(NQ)\) となってしまい今回の制約の場合、実行制限時間に間に合いません。

ここで、今まで「\(S\) の末尾の文字を削除し、先頭に挿入する」という操作を何回行ったかとして整数 \(P\) を持ちます。はじめは \(P=0\) です。

1 x のクエリが来た場合、\(P\)\(x\) 増やせばよいです。

2 x のクエリが来た場合を考えます。

\(S\) の末尾の文字を削除し、先頭に挿入する」という操作を \(x\) 回する前の \(S\)\(X\)、した後の \(S\)\(Y\) と置きます。すると、ここで \(X_{i-x \bmod N}=Y_i\) が成り立ちます。

なので、\(S_{x-P \bmod N}\) を出力すればよいです。

よりこの問題を計算量 \(\mathrm{O}(N+Q)\) で解くことができました。これは十分高速です。

posted:
last update: