競技プログラミング用 知識集積所

ABC410C - Rotatable Array

最終更新:

sport_programming

- view
管理者のみ編集可


問題


必要知識

B以下レベルの内容は省略
  • 特になし

考え方

愚直にやると、deque(未作成)あたりを使ってやればすぐにできそうに見える。
しかし、クエリ3のときのkの値が大きいと、計算量が大きくなる。
また、毎回vector(未作成)を作り直すのも、nの値が大きいと時間が間に合わなくなる。

そこで、最初はスタート位置を0番としておいて、クエリ3のときにはデータの方ではなくスタート位置の方を1つずらすことにする。
要求位置を調べる際に、後ろにはみ出したらループして先頭に戻るということにすれば、渡されたデータを一切いじらずに解答できる。
しかも、これはk回ずらすのを単純にk足す処理として済ませられるのでTLEも回避できる。

ただし、クエリ1とクエリ2のときに、スタート位置から見ての位置を正しく計算する必要がある。
%演算を使ってうまく処理すること。

解答例


注意点

kを単純に加算していくなら、long long型を使う。

スタート位置をずらす際、ただ単純に足していくとint型範囲を超える可能性がある。
毎回剰余を計算するか、long long型を使うかのいずれかが必要。

別解

ウィキ募集バナー