CF1264D Beautiful Bracket Sequence
2022.10.25
CF1264D Beautiful Bracket Sequence
洛谷:CF1264D1 Beautiful Bracket Sequence (easy version)
洛谷:CF1264D2 Beautiful Bracket Sequence (hard version)
Codeforces:CF1264D1 Beautiful Bracket Sequence (easy version)
Codeforces:CF1264D2 Beautiful Bracket Sequence (hard version)
Problem
给定一个含 ?
的括号序列。定义一个括号序列的权值为删除一些字符使其成为合法的字符序列后,括号匹配的最深深度。求把 ?
替换成括号的所有方案中,括号序列的权值之和。
D1:\(n\le 2000\)。
D2:\(n\le 10^6\)。
Solution D1
采用了与 \(D2\) 完全不同的做法:区间 dp。几乎没有用到任何组合数知识。
记 \(f[l][r]\) 为区间内答案,为了不重不漏,有如下转移方式:
其中 \(k\) 为 \([l + 1, r - 1]\) 内的问号数,相当于固定左右两端一定可以增加 \(1\) 深度,中间的问号随便填。
意义简单,不解释。
Solution D2
用组合的思想重新审视 D1,这个 D1 就值 2600。
首先有这样一件事:一个最大深度不为 \(0\) 的确定序列中,必然存在一个左侧左括号数与右侧右括号数相等的断点(在某两个相邻字符之间),且该断点唯一。
记左侧括号数为 \(w_l\),右侧括号数为 \(w_r\),最大深度 \(d\)。
先证明存在。该序列有不为 \(0\) 的最大深度 \(d\),考虑将断点从左往右移动至 \(w_l=d\),在 \(w_l\) 维持不变的过程中,不会出现新的左括号,且由于最大深度为 \(d\),所以考虑前 \(d + 1\) 个左括号时,必须满足 \(w_r \le d\),所以在达到这个第 \(d + 1\) 个左括号前,可以通过消除右侧右括号数目,使得 \(w_l = d \ge w_r\) (或者没有 \(d + 1\) 个左括号,直接考虑到末尾,而末尾后相当于没有右括号)。而最初刚好达到第 \(d\) 个左括号时,由于最大深度为 \(d\),又有 \(w_l = d \le w_r\)。\(w_r\) 从 \(\ge w_l\) 变为 \(\le w_l\),且该过程中 \(w_l\) 恒为 \(d\),所以一定存在一个位置,使得 \(w_l = w_r = d\)。右侧分析同理。
断点唯一就显然了,从左往右的过程中,每一次移动发生 \(w_l\) 增加或 \(w_r\) 减小,\(w_l - w_r\) 单增,从右往左同理,所以 \(w_l - w_r\) 严格单调,\(w_l - w_r = 0\) 只有一个位置满足。
唯一说明什么?我们可以直接通过 \(w_l = w_r\) 的限制知道 \(w_l = w_r = d\) 然后随便干点什么组合计数统计答案,且对于一个确定的序列,这样的计数方式是不重复的。
这个 2600 就很值了。还要考虑组合计数呢:
考虑对一个不确定的序列,枚举每一个断点,记不确定序列中左侧左括号数为 \(l\),右侧右括号数为 \(r\),左侧问号数为 \(x\),右侧问号数为 \(y\)。
该断点对应多个确定序列的贡献,其总贡献为:
枚举 \(i\) 决定了最大深度,\((l + i)\) 为这一类确定序列的贡献,第二个二项式系数是由 \(w_l = w_r\) 限制出来的。
D1 就按照上面的式子暴力就好了。
D2 这多出来的 300 给了组合数的推导。
二项式系数乘积之和,想到了什么?范德蒙德卷积。
\((l + i)\) 不太好看,考虑拆开分别处理。
记左侧式子为 \(S_1\),右侧式子为 \(S_2\)。
\(S_2\) 要麻烦一点。考虑消去 \(i\):
再次使用范德蒙德卷积:
\(i = -1\) 没有意义,直接丢掉。化成标准形式:
整理得:
预处理组合数,枚举断点 \(O(n)\)。