Official

B - Triple Shift Editorial by maroonrk_admin


\(A\)\(B\) の値が多重集合として一致していない場合は明らかに不可能です. 以下,値の集合は同じであるとします.

まず,\(A\) の値がすべて distinct である場合を考えます. 数列 \(A\) の転倒数の偶奇を考えると,これは操作によって変化しません. そして逆に,\(A\)\(B\) 転倒数の偶奇が一致しているならば,必ず \(A\)\(B\) に変化させられます.

これは次のように示せます. まず,\(N \geq 3\) ならば,適当な操作を繰り返して,好きな値を先頭に持ってくる,という操作ができます. これを先頭から \(1,2,\cdots,N-2\) 番目の値に対して繰り返すことで,\(A,B\) の先頭 \(N-2\) 項を一致させることができます. あとは残りの \(2\) 項の順序が一致すればよいですが,これは転倒数の偶奇から定まるため,結局 \(A,B\) が一致することになります.

最後に,\(A\) の値に重複がある場合を考えます. この場合は,実は必ず \(A\) から \(B\) へと変化可能であることが示せます. 具体的にはまず,重複がある値にラベルをつけて(例えば \(v\) という値には \(v_1,v_2,\cdots\) とラベルをつける),一旦すべての値を distinct にします. もしこれで \(A,B\) の転倒数の偶奇が一致すればそのまま操作すればよいです. 一致しない場合は,\(A\) の中で \(v_1,v_2\) のラベルを swap すればよいです. こうすることで,転倒数の偶奇が変わり,distinct な場合の手順で解くことができます.

あとは上の判定手順をそのまま実装すればよいです. \(O(N\log N)\) 時間で解くこともできますが,制約は \(O(N^2)\) も許容しています.

解答例(c++)

posted:
last update: