CF1750E Bracket Cost && P9356 「SiR-1」Bracket 题解

大体相同。

CF1750E Bracket Cost

我们能对一个括号序列做以下操作:

  • 选择一个子串,将其循环右移一位。比如,(()) 循环右移一位之后变为 )(()。
  • 在括号序列的任意位置加一个左括号或右括号。

记这个括号序列的代价为能将其变为匹配序列的最少操作次数。

给一个括号序列,求其非空子串的代价之和。n≤2×105n\leq 2\times 10^5。


法一

考虑一个括号序列的代价,将匹配的括号删去,则序列形如 )))((,记 ) 有 xx 个,( 有 yy 个,则使用 min⁡(x,y)\min(x,y) 个操作 11 循环位移,∣x−y∣|x-y| 次操作 22 补上括号,总次数 max⁡(x,y)\max(x,y)。

考虑分别表示出 x,yx,y,记 sis_i 表示前缀 ( 个数 - ) 个数。

注意到一些匹配的括号和为 00,即不影响前缀和,根据最后序列形如 )))((,考虑找到左右括号分界处,即为 sl−1,rs_{l-1,r} 的最小值 sxs_x,则之前有 −(sx−sl−1)-(s_x-s_{l-1}) 个 ( 无法匹配,之后有 sr−sxs_r-s_x 个 ) 无法匹配,所以:

ans=∑l,rmax⁡(−(min⁡i=l−1rsi−sl−1),sr−min⁡i=l−1rsi−sl−1)=∑l,rmax⁡(sl−1,sr)−min⁡i=l−1rsi=∑l=0n∑r=l+1nmax⁡(sl,sr)−min⁡i=lrsi\begin{aligned} ans &= \sum_{l,r}\max(-(\min_{i=l-1}^{r}s_i-s_{l-1}),s_r-\min_{i=l-1}^{r}s_i-s_{l-1})\\ &= \sum_{l,r}\max(s_{l-1},s_r)-\min_{i=l-1}^{r}s_i \\ &=\sum_{l=0}^{n}\sum_{r=l+1}^{n}\max(s_l,s_r)-\min_{i=l}^{r}s_i \end{aligned}

前者排序处理,后者单调栈。

桶排即可做到 O(∑n)\mathcal O(\sum n)。

法二

将法一的匹配括号和未匹配括号和起来考虑,设一个序列有 LL 个 ( 和 RR 个 ),xx 对匹配的括号,则代价为 max⁡(L−x,R−x)=max⁡(L,R)−x\max(L-x,R-x)=\max(L,R)-x。

则 ans=∑l,rmax(L,R)−xans=\sum\limits_{l,r}max(L,R)-x。

对于 ∑max⁡(L,R)\sum \max(L,R),有 max⁡(L,R)=(L+R)+∣L−R∣2\max(L,R)=\frac{(L+R)+|L-R|}{2},维护前缀和,拆开绝对值,容易求。

考虑 ∑x\sum x,假设当前一个 ),找到前面第一个与其匹配的 (,分别记为 l,rl,r,那么贡献为 l×(n−r+1)l\times (n-r+1),即包含这对括号的区间个数。

桶排,复杂度 O(∑n)\mathcal O(\sum n)。

P9356 「SiR-1」Bracket

我们能对一个括号序列做以下操作:

  • 将序列循环右移任意位。。
  • 在括号序列的任意位置加一个左括号或右括号。

记这个括号序列的代价为能将其变为匹配序列的最少操作次数。

给一个括号序列,求其非空子串的代价之和。n≤2×107n\leq 2\times 10^7。


设一个序列有 LL 个 ( 和 RR 个 ),xx 对匹配的括号,则代价为 ∣L−R∣+[x≠min(L,R)]|L-R|+[x \ne min(L,R)]。

前者容易算,对于后者,考虑

posted @ 2023-05-22 14:07  蒟蒻orz  阅读(53)  评论(0)    收藏  举报  来源