B - Flip Card Stack 解説 by Tamiji

殴る

注: この解説では高速化のため非常に高度なデータ構造を使用していますが,本問の制約では公式解説の解法で十分です.

列 \(A=(A_1,\dots,A_N)\) を以下のように定めます.

  • 上から \(i\) 番目のカードに書かれている数を \(x\) とする.そのカードが表向きのとき \(A_i=x\),裏向きのとき \(A_i=-x\).

最初 \(A=(1,\dots,N)\) です.また, \(i\) 回目の操作は以下のように表せます.

  • \(A\) の \(1,\dots,K_i\) 番目を反転する.
  • 各 \(j(1\le j\le K_i)\) について, \(A_j\) に \(-1\) をかける.

これは Implicit Treap (遅延伝搬反転可能乱択平衡二分木) を用いてそのまま実装できます.

計算量は \(O(N+Q\log N)\) ですが,かなり定数倍が重いです.