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

大体相同。

CF1750E Bracket Cost

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

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

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

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


法一

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

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

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

ans=l,rmax((mini=l1rsisl1),srmini=l1rsisl1)=l,rmax(sl1,sr)mini=l1rsi=l=0nr=l+1nmax(sl,sr)mini=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(Lx,Rx)=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)+LR2\max(L,R)=\frac{(L+R)+|L-R|}{2},维护前缀和,拆开绝对值,容易求。

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

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

P9356 「SiR-1」Bracket

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

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

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

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


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

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

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