はまやんはまやんはまやん

hamayanhamayan's blog

Round And Round [Aizu Competitive Programming Camp 2018 Day 2 C]

https://onlinejudge.u-aizu.ac.jp/beta/room.html#ACPC2018Day2/problems/C

考察過程

1. サンプルを眺めて考えると、スワップというより回転のように見える
2. ちょっと例を出して考えても回転みたい
3. 先頭が何かを覚えておいて回転させよう

解法

https://onlinejudge.u-aizu.ac.jp/beta/review.html#ACPC2018Day2/3149595

スワップを回転と考えて解く。
現在の先頭をtopとする(0-indexed)
 
クエリ0
topからk番目の数はtop+k-1となる。
しかし、一周している可能性があるので、modNとして、(top+k-1)%Nである。
1-indexedにして答えると答え。
 
クエリ1
k番目とk+1番目で分けて入れ替えるが、これはk回左に回転させると言い換えられる。
なので、top+=kとすればいい。
一周した場合も考えてmodNとする。

int N, Q;
int top = 0;
//---------------------------------------------------------------------------------------------------
void _main() {
    cin >> N >> Q;
    rep(_, 0, Q) {
        int t, k; cin >> t >> k;

        if (t == 0) {
            int ans = (top + k - 1) % N;
            printf("%d\n", ans + 1);
        } else {
            top = (top + k) % N;
        }
    }
}