Codeforces Round #348 B. Little Artem and Dance
http://codeforces.com/contest/668/problem/B
問題概要
1..n が順に並んだ数列 A が与えられる。この数列に対して以下の 2 種類の操作を行う。
- 数列を x だけ回転シフトする。
- 隣り合う要素同士を交換する。つまり i:0→n/2-1 に対して swap( A[ 2i ], A[ 2i+1 ] ) を行う。
最終的な数列 A を求めよ。
解法
数列を偶数番目と奇数番目で分離して考えてみる。
回転操作は以下のようになる。
偶奇の交換は以下のようになる。
どちらの操作も回転を無視すれば順序を維持している。
自分が考えた方法は「回転量の合計」を偶奇それぞれに対して求めておき、最後にまとめて回転するというもの。
結局 1 と 2 の位置の情報があれば最終的な数列が求まるので、1 と 2 だけシミュレートするという方法もある。
本番中提出したコード
http://codeforces.com/contest/668/submission/17491259
1,2だけシミュレート
http://codeforces.com/contest/668/submission/17501912
Codeforces Round #348 B. Little Artem and Dance 賢い
問題を理解するのにかなり時間を掛けてしまった。