B - カッコつけ Editorial by maspy


注意

入力例 1 に関する説明に誤りがあります。

  • 2 回目の操作が終わったあとの状態は ()(
  • 4 回目の操作が終わったあとの状態は )()((
  • 5 回目の操作が終わったあとの状態は ()(

解法

ついでに少し触れます。

カッコ列から、正しいカッコ対を最大限取り去ると、)))))((( のように「閉じ括弧 \(x\) 個 → 開き括弧 \(y\) 個」という文字列が残ります。カッコ悪さは \(x+y\) です。

カッコ列 \(S\) に対してこの \((x, y)\)\(f(S)\) と書けば、\(f(S+T)\)\(f(S), f(T)\) から計算できることが分かります。したがって、例えば追加・削除がなければ解答クエリにはセグメント木・平方分割といった手法で答えることができます。

あとは、追加・削除ができるようにすればよいです。

  • 二分木に適宜回転して、平衡性を持たせる(平衡二分木)
  • 平方分割で列をバケットに分けて持ち、あるバケットが満杯になるたびに作り直す

などの方法があると思います。

posted:
last update: