1 条题解
-
0
自动搬运
来自洛谷,原作者为

Starrykiller
祈祷着今后的你的人生,永远都有幸福的「魔法」相伴。搬运于
2025-08-24 23:08:37,当前版本为作者最后更新于2025-04-05 22:09:43,作者可能在搬运后再次修改,您可在原文处查看最新版自动搬运只会搬运当前题目点赞数最高的题解,您可前往洛谷题解查看更多
以下是正文
鲜花:


约定:。
这题也太困难了吧!
首先你得有一个靠谱的 复杂度的做法。
括号序列的一个经典思路是,拆第一对匹配的括号 DP,形如 。
由此可以设计出状态:
- :钦定 被选中且匹配的合法本质不同子序列个数。
- :钦定 被选中(但未必匹配)的合法本质不同子序列个数。
判掉 Corner Case:
- 若 或 ,则 。
- 若 ,则 。
考虑转移。
首先 的转移是容易的——无非就是某个 外面套一层 ,但是我们要保证不重不漏地转移。
观察到关键性质:令 ,且 ,。那么, 这个状态代表的括号序列一定被 代表的括号序列包含——这意味着我们直接计数 即可。
为了方便描述,令 表示 前面第一个满足 的 (不存在规定为 ), 同理(不存在规定为 )。
那么我们可以得到 的转移(别忘了算上 单独匹配的贡献):
$$f(l,r)=1+\sum_{ \substack{ l\lt i\lt j\lt r \\ \pre(i)\lt l,A_l\neq A_i\\ \nxt(j)\gt r,A_j\neq A_r } } g(i,j) $$考虑 的转移。显然 蕴含 ,然后枚举 匹配右括号 ,以及 后面的第一个左括号 。
显然我们还是要贪心地选取最前面的 ,所以 。朴素地考虑可以得到:
$$g(l,r)=f(l,r)+\sum_{ \substack{ l\lt i\lt j\lt r \\ |A_l|\neq |A_i|,A_i\gt 0 \\ A_j\lt 0, |A_i|\neq |A_j|\\ \pre(j)\lt i } } f(l,i)\cdot g(j,r) $$这对吗?这显然不对。我们只考虑了 ,但是 同样被算重了。
一个朴素的想法是,加入限制 (贪心地取最右边的 )。这对吗?
这还是不对。考虑如下的事情:
$$\begin{aligned} \mathop{\texttt{\textcolor{ff99cc}(}}\limits_{l} \texttt{...} \mathop{\texttt{\textcolor{935ba5})}}\limits_{i} \texttt{...} \mathop{\texttt{\textcolor{87b3ed}(}}\limits_{j} \texttt{...} \mathop{\texttt{\textcolor{935ba5})}}\limits_{i'} \texttt{...} \mathop{\texttt{\textcolor{87b3ed}(}}\limits_{j'} \texttt{...} \texttt{\textcolor{F4DE90})} \texttt{\textcolor{FF8C69}(} \mathop{\texttt{\textcolor{eb234b})}}\limits_{r} \end{aligned} $$考虑 ,,这样还是算重了。
考虑算重的是哪个部分:显然是 。我们直接减去它即可。不难发现这样也不需要再加入 的限制,我们直接减去 即可。
于是得到转移式
$$g(l,r)=f(l,r)+\sum_{ \substack{ l\lt i\lt j\lt r \\ |A_l|\neq |A_i|,A_i\gt 0 \\ A_j\lt 0, |A_i|\neq |A_j|\\ \pre(j)\lt i } } f(l,i)\cdot g(j,r) - \sum_{ \substack{ l\lt i\lt j\lt r \\ |A_l|\neq |A_i|,A_i\gt 0 \\ A_j\lt 0, |A_i|\neq |A_j|\\ \pre(j)\lt i \\ \pre(i)\gt l } } f(l,\pre(i))\cdot g(j,r) $$答案就是所有 的 之和。
暴力地转移,时间复杂度 。由于状态数极少,所以记忆化搜索可以通过子任务 ,期望得分 。
这个东西一眼就很可以优化。考虑怎么优化到三次方。
$$f(l,r)=1+\sum_{ \substack{ l\lt i\lt j\lt r \\ \pre(i)\lt l,A_l\neq A_i\\ \nxt(j)\gt r,A_j\neq A_r } } g(i,j) $$首先你发现 这个条件已经蕴含在 里面了,所以可以直接丢掉。那么就是
$$f(l,r)=1+\sum_{ \substack{ l\lt i\lt j\lt r \\ \pre(i)\lt l, \nxt(j)\gt r } } g(i,j) $$考虑对每一个 ,把它贡献到 。不难发现它只会贡献到 (开区间)这个矩形中。同一个长度之间没有贡献,所以直接做 次二维前缀和即可,这是 的;
$$g(l,r)=f(l,r)+\sum_{ \substack{ l\lt i\lt j\lt r \\ |A_l|\neq |A_i|,A_i\gt 0 \\ A_j\lt 0, |A_i|\neq |A_j|\\ \pre(j)\lt i } } f(l,i)\cdot g(j,r) - \sum_{ \substack{ l\lt i\lt j\lt r \\ |A_l|\neq |A_i|,A_i\gt 0 \\ A_j\lt 0, |A_i|\neq |A_j|\\ \pre(j)\lt i \\ \pre(i)\gt l } } f(l,\pre(i))\cdot g(j,r) $$再来看这个,枚举 ,求出合法的 之和,这是容易的(对于 的限制可以直接容斥掉)。
综上时间复杂度 。精细实现可以通过本题。代码是简单的。
小圆亲亲!/qq
- 1
信息
- ID
- 11362
- 时间
- 2000ms
- 内存
- 1024MiB
- 难度
- 6
- 标签
- 递交数
- 0
- 已通过
- 0
- 上传者