1 条题解

  • 0
    @ 2025-8-24 23:08:37

    自动搬运

    查看原文

    来自洛谷,原作者为

    avatar Starrykiller
    祈祷着今后的你的人生,永远都有幸福的「魔法」相伴。

    搬运于2025-08-24 23:08:37,当前版本为作者最后更新于2025-04-05 22:09:43,作者可能在搬运后再次修改,您可在原文处查看最新版

    自动搬运只会搬运当前题目点赞数最高的题解,您可前往洛谷题解查看更多

    以下是正文


    鲜花:


    约定:1-indexed\texttt{1-indexed}


    这题也太困难了吧!

    首先你得有一个靠谱的 poly\mathrm{poly} 复杂度的做法。

    括号序列的一个经典思路是,拆第一对匹配的括号 DP,形如 (...)...\texttt{\textcolor{red}(...\textcolor{red})...}

    由此可以设计出状态:

    • f(l,r)f(l,r):钦定 l,rl,r 被选中且匹配的合法本质不同子序列个数。
    • g(l,r)g(l,r):钦定 l,rl,r 被选中(但未必匹配)的合法本质不同子序列个数。

    判掉 Corner Case:

    • Al>0A_l\gt 0Ar<0A_r\lt 0,则 f(l,r)=g(l,r)=0f(l,r)=g(l,r)=0
    • Al=Ar|A_l|=|A_r|,则 f(l,r)=0f(l,r)=0

    考虑转移。

    首先 f(l,r)f(l,r) 的转移是容易的——无非就是某个 gg 外面套一层 ()\texttt{()},但是我们要保证不重不漏地转移。

    观察到关键性质:令 L<l<r<RL\lt l\lt r\lt R,且 AL=AlA_L=A_lAr=ARA_r=A_R。那么,g(l,r)g(l,r) 这个状态代表的括号序列一定被 g(L,R)g(L,R) 代表的括号序列包含——这意味着我们直接计数 g(L,R)g(L,R) 即可。

    \gdef \pre {\operatorname{pre}} \gdef \nxt {\operatorname{nxt}}

    为了方便描述,令 \pre(i)\pre(i) 表示 ii 前面第一个满足 Ai=AjA_i=A_jjj(不存在规定为 00),\nxt(i)\nxt(i) 同理(不存在规定为 (n+1)(n+1))。

    那么我们可以得到 ff 的转移(别忘了算上 l,rl,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) $$

    考虑 gg 的转移。显然 gg 蕴含 ff,然后枚举 ll 匹配右括号 ii,以及 ii 后面的第一个左括号 jj

    显然我们还是要贪心地选取最前面的 jj,所以 \pre(j)<i\pre(j)\lt i。朴素地考虑可以得到:

    $$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) $$

    这对吗?这显然不对。我们只考虑了 jj,但是 ii 同样被算重了。

    一个朴素的想法是,加入限制 \nxt(i)>j\nxt(i)\gt j(贪心地取最右边的 ii)。这对吗?

    这还是不对。考虑如下的事情:

    $$\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} $$

    考虑 f(l,i)g(j,r)f(l,i)\cdot g(j,r)f(l,i)g(j,r)f(l,i')\cdot g(j',r),这样还是算重了。

    考虑算重的是哪个部分:显然是 f(l,i)g(j,r)f(l,i)\cdot g(j',r)。我们直接减去它即可。不难发现这样也不需要再加入 \nxt(i)>j\nxt(i)\gt j 的限制,我们直接减去 [\pre(i)>l]f(l,\pre(i))g(j,r)[\pre(i)\gt l] f(l,\pre(i))\cdot g(j,r) 即可。

    于是得到转移式

    $$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) $$

    答案就是所有 \pre(i)=0,\nxt(j)=n+1\pre(i)=0,\nxt(j)=n+1g(i,j)g(i,j) 之和。

    暴力地转移,时间复杂度 O(n4)\mathcal{O}(n^4)。由于状态数极少,所以记忆化搜索可以通过子任务 141\sim 4,期望得分 7676


    这个东西一眼就很可以优化。考虑怎么优化到三次方。

    $$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) $$

    首先你发现 AlAiA_l\neq A_i 这个条件已经蕴含在 \pre(i)<l\pre(i)\lt l 里面了,所以可以直接丢掉。那么就是

    $$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(i,j)g(i,j),把它贡献到 f(l,r)f(l,r)。不难发现它只会贡献到 l(\pre(i),i),r(j,\nxt(j))l\in (\pre(i),i),r\in(j,\nxt(j))(开区间)这个矩形中。同一个长度之间没有贡献,所以直接做 Θ(n)\Theta(n) 次二维前缀和即可,这是 Θ(n3)\Theta(n^3) 的;

    $$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) $$

    再来看这个,枚举 ii,求出合法的 jj 之和,这是容易的(对于 AiAj|A_i|\neq |A_j| 的限制可以直接容斥掉)。

    综上时间复杂度 Θ(n3)\Theta(n^3)。精细实现可以通过本题。代码是简单的。

    小圆亲亲!/qq

    • 1

    信息

    ID
    11362
    时间
    2000ms
    内存
    1024MiB
    难度
    6
    标签
    递交数
    0
    已通过
    0
    上传者