【题解】P9266 | dp 凸完全单调性 dp优化
模拟赛考到这个题,数据范围加个 $0$ 卡掉三只 $\log$ 和大常数两只 $\log$,很可恶,没有写完两只 $\log$。
令 $\text{cost}(l,r)$ 表示 $[l,r]$ 的代价,即一个区间内合法的括号子串个数,显然一个合法括号串不会包含任何不合法的括号,所以用不合法括号将串分成若干段,形成括号树森林,一个合法的括号串一定是一个点的某一段完整的儿子组成的,然后查询时即查询了如下这样一个区域内的括号构成的合法括号串数:
维护 $cr_x$ 表示这个括号到根的这条链上所有右侧的兄弟及其子树内的合法的括号串数,$cl_x$,表示这个括号到根的这条链上所有左侧的兄弟及其子树内的合法的括号串数,$ctot_x$ 表示 $x$ 子树内合法的括号串数,这三者均可以提前在括号树上 dfs 求出。
查询 $[u,lca),[v,lca)$ 这两条链上的 $vr,vl$ 的和,然后再算上两者在 $lca$ 处中间夹住的兄弟及其 $ctot$ 就行了。区间的开或闭需要手动处理细节较多。
于是我们现在可以 $O(\log n)$ 计算一个区间的代价了。
回到划分问题上,肯定得先对划分 dp,令 $f_{i,K}$ 表示 $[1,i]$ 分 $K$ 段的最小代价,$f_{i,K}=\min(f_{j,K-1}+\text{cost}(j+1,i))$,经典分 $K$ 段,考虑这个代价和区间长度的关系,两个包含的区间加上同样的部分,被包含的区间增加的代价感觉是更少的,猜测其具有决策单调性和凸完全单调性,打表可以验证其代价满足四边形不等式,证明如下:
首先对于一个括号串 $S$,在左侧任意添加任意括号都不会改变 $S$ 中合法的括号串的情况,右侧同理。
将四边形不等式变形成 $\text{cost}(b,d)-\text{cost}(b,c) \leq \text{cost}(a,d)-\text{cost}(a,c)$,称左侧为 $\Delta_b$,右侧为 $\Delta_a$,两者都包含了左右端点都在 $(c,d]$ 之间的合法括号串,而对于右端点在 $(c,d]$ 之间的括号串,$\Delta_b$ 限制了左端点在 $[b,c]$ 中而 $\Delta_a$ 的限制是其超集 $[a,c]$,所以 $\Delta_a$ 中此类串的出现次数一定不少于 $\Delta_b$,所以四边形不等式成立。
在具有决策单调性和凸完全单调性后剩下的就是套路了。
我们得到 $f_{i,K}$ 关于 $K$ 下凸,考虑 wqs 二分,每分一段产生惩罚代价 $\Delta$,二分 $\Delta$ 去掉第一维度,现在转移为 $f_i = \min (f_j+\text{cost}(j+1,i)+\Delta)$。
接下来对这个具有决策单调性的 dp 转移维护队列,每次在队尾二分可以弹掉的区间,每次 dp 需要查询 $O(n\log n)$ 次 $\text{cost}(l,r)$。
目前时间复杂度 $O(n\log^3 n)$,可以通过本题,有如下继续优化的方式。
我们的三只 $\text{log}$ 分别来源于 wqs 二分,决策单调性(二分队列),查询区间代价,其实后面两只 $\log$ 都可以去掉,查询区间代价可以使用 $O(1)$ 的 LCA 和 $k$ 级祖先(长链剖分)找到 LCA 处对应的儿子并查询。决策单调性部分可以使用 SMAWK 算法做到线性,最终时间复杂度 $O(n\log n)$。
本文已经结束了。本文作者:ღꦿ࿐(DeepSea),转载请注明原文链接:https://www.cnblogs.com/Dreamerkk/p/17970897,谢谢你的阅读或转载!