Official

O - Longest Bracket Subsequence Editorial by shiomusubi496


まず、括弧列 \(S\) に対し、正規括弧列である最長の部分列の長さを求める方法を考えます。
(\(+1\), )\(-1\) とみなして累積和を取ることを考え、 \(R_i = \displaystyle \sum_{j=1}^{i-1} S_j\) (ただし \(R_0 = 0\)) とします。
このとき、求める長さは \(\lvert S \rvert - (R_0 - \min(R)) - (R_{\lvert S \rvert} - \min(R)) = \lvert S \rvert + \min(R) \times 2 - R_{\lvert S \rvert}\) であることが証明できます。

略証:正規括弧列である必要十分条件が () の数が等しく累積和が常に \(0\) 以上であることであるのを用いると、これが下界であることが言える。また実際に \(\min_{j=0}^{i-1} R_j>R_i\)\(\min_{j=i}^{\lvert S \rvert} R_j>R_{i-1}\) を満たす \(i\) について \(S_i\) を削除すれば、下界を達成できる。

よって \(3\) 整数の組 \((\lvert S \rvert, R_{\lvert S \rvert}, \min(R))\) から答えを計算できます。

また、 \(S\) に対する組 \((s_{len}, s_{sum}, s_{min} )\)\(T\) に対する組 \((t_{len}, t_{sum}, t_{min})\) があるとき、 \(S\)\(T\) をこの順に連結した文字列に対する組は \((s_{len} + t_{len}, s_{sum} + t_{sum}, \min(s_{min}, s_{sum} + t_{min}))\) となることが分かります。

さらに、文字列 \(S\)() を入れ替えるとき、 \((\lvert S \rvert, R_{\lvert S \rvert}, \min(R))\)\((\lvert S \rvert, -R_{\lvert S \rvert}, -\max(R))\) になります。よって \(\max(R)\) も同時に持てば \(T_j = 2\) のクエリに対応することができます。

よって、 Heavy Light Decomposition により木を列に分解し、 Segment Tree で \(4\) 整数の組を管理すればいいです。計算量は \(\Theta(N \log N + Q \log^2 N)\) です。

posted:
last update: