做题记录 25.8.30

QOJ #7644. Good Splits

\(H\) 表示卡特兰数

\(()\) 表示连线在上方,\([]\) 表示连线在下方,则用 \(f_n\) 表示长度为 \(2n\)\((),[]\) 分别匹配的方案数,显然 \(f_n=\sum_{i=0}^n \binom{2n}{2i} H_{i} H_{n-i}\)

\(c_{x,l}\) 表示将 \(l\) 划分为 \(x\) 个自然数,一种划分方案的权值为每段的 \(f\) 之积,所有划分方案的权值和,其转移是容易的

\(dp_n\) 表示满足 \(f_n\) 的条件的基础上,不存在一个子区间使得区间内和删除该区间后剩余部分都合法(若将匹配的括号作为一个点,若两组匹配相交且不包含则连边,要求得到的图连通),则

\[dp_n\gets f_n-\sum_{i=1}^{n-1} dp_{n-i} c_{2(n-i),i} \]

即在 \(f_n\) 的基础上减去不合法的数量,其中枚举第一个字符所在连通块大小为 \(2(n-i)\),将剩余 \(2i\) 个字符分为 \(2(n-i)\) 组,依次填入 \(2(n-i)\) 个空隙(不含第一个字符以前的位置)中

\(rs_i\) 表示 \(i\) 的答案,令 \(g_{x,l}\) 表示将 \(l\) 划分为 \(x\) 个自然数,一种划分方案的权值为每段 \(rs\) 之积,所有划分方案的权值和

对于同一 \(l\) 先计算 \(rs_l\) 再计算 \(g_{\ast,l}\)

计算 \(rs_l\) 时枚举最外侧的连通块大小,剩余部分填到空隙中,可得 \(rs_l=\sum_{i=1}^l dp_i g_{i+i,l-i}\)

计算 \(g\) 是容易的

总时间复杂度 \(O(n^3)\)

代码

参考

posted @ 2025-08-31 10:11  Hstry  阅读(4)  评论(0)    收藏  举报