Kazun の競プロ記録

競技プログラミングに関する様々な話題を執筆します.

AtCoder Beginner Contest 223 F 問題 Parenthesis Checking

問題

atcoder.jp

提出解答

atcoder.jp

問題の概要

 "{\tt (}", "{\tt )}" からなる長さ  N の文字列  S が与えられる. 以下の  Q 個のクエリを順に処理せよ.

  1.  S l 文字目と  r 文字目を入れ替える.
  2.  S l 文字目から  r 文字目までの部分文字列が正しい文字列かどうかを判定する.

制約

  •  1 \leq N,Q \leq 2 \times 10^5
  •  1 \leq l \leq r \leq N
  •  S "{\tt (}", "{\tt )}" からなる長さ  N の文字列

解法

 "{\tt (}", "{\tt )}" からなる文字列  T において, 以下は同値である.

  •  T は正しい文字列
  •  V T_i="{\tt (}" ならば,  V_i=1 , T_i="{\tt )}" ならば,  V_i=-1 とした列とし, 累積和を  \widetilde{V} としたとき, 以下が成立する.
    •  \widetilde{V}_{|T|}=0
    •  \min \widetilde{V} \geq 0 (※  \min \widetilde{V}=0 と同値)

そして, 更新は1点, 取得は区間であることから, 以下のモノイド  M を搭載したセグメント木を用いることで高速に処理できる.

ここで,  (a,b) \in M に対して,  a は累積和,  b は累積和の最小値を表している. そして,  "{\tt (}" (1,0) \in M に,  "{\tt )}" (-1,-1) に対応させることで, 整合性を持たせられる.

計算量は,  O(Q \log N) である.