一篇小总结,已放入 Re:从零开始的生成函数魔法。
更好的阅读体验
划分类问题,即将序列或图分割成若干部分,求所有划分方式的权值运算结果(和,积或最值等)的问题。
动态规划非常适合此类问题,并通常可以使用前缀和,卷积(对和/积类)或数据结构(对最值类)等方式优化。
1. 序列划分
形式化的,定义划分为 \(P=\{(l_1,r_1),\cdots,(l_k,r_k)\}\),其中 \(l_1=1,r_k=n\),\(r_i=l_{i-1}+1,\forall i \in (1,n]\)。
对于此类问题,经典做法是考虑 \(f_i\) 表示前 \(i\) 个数中,最后一段的结尾为 \(i\) 的答案。
考虑由 \(f_j\) 加上 \([j+1,i]\) 转移,设 \(Q(j)\) 表示满足条件的 \(j\),那么有:
\[f_i=\min\limits_{0 \leq j <i \bigwedge Q(j)} \{f_j \oplus w(i+1,j)\}
\]
或是:
\[f_i=\sum\limits_{0 \leq j <i \bigwedge Q(j)} (f_j \oplus w(i+1,j))
\]
当然这只是第一步,后面的优化才是重点……
最值类的划分题目普遍利用性质(如 P5665 [CSP-S2019] 划分 ),DP 优化(如斜率优化 [HNOI2008]玩具装箱;wqs 二分 [SDOI2016]征途),以及数据结构解决。由于花样太多,这里不作讨论。
接下来重点关注划分积和与划分和两类问题。
1.1 划分积和
- 给定序列 \(a_1,\cdots,a_n\),定义划分 \(P=\{(l_1,r_1),\cdots,(l_n,r_n)\}\) 的权值为:
\[w(P)=\prod\limits_{i=1}^k val_{r_i-l_i+1} \sum\limits_{t=l_i}^{r_i} a_i
\]
-
求所有划分的权值之和。
-
\(n \leq 10^5\)。
就是把上面两个合起来。
\[f_i=\sum\limits_{0 \leq j <i} f_jval_{i-j}(s_i-s_j)
\]
拆完括号再分治 FFT 即可。
\[\begin{aligned}
f_i
& =\sum\limits_{0 \leq j <i} f_jval_{i-j}(s_i-s_j) \\
& =s_i\sum\limits_{0 \leq j <i} f_jval_{i-j}-\sum\limits_{0 \leq j <i} f_js_jval_{i-j}
\end{aligned}
\]
\(O(n \log n)\)。
1.2 划分和
- 给定序列 \(a_1,\cdots,a_n\),定义划分 \(P=\{(l_1,r_1),\cdots,(l_n,r_n)\}\) 的权值为:
\[w(P)=\sum\limits_{i=1}^k val_{r_i-l_i+1} \sum\limits_{t=l_i}^{r_i} a_i
\]
-
求所有划分的权值之和。
-
\(n \leq 10^5\)。
稍有不同,就是把乘改成加;然而由于这个状态不止被计算了一次,还需要考虑转移到状态 \(j\) 的方案数 \(v_j\)。
\[v_i=\sum\limits_{0 \leq j <i} v_j
\]
这个问题里其实 \(v_i=2^{i-1}\)。
\[f_i=\sum\limits_{0 \leq j <i} [f_j+v_jval_{i-j}(s_i-s_j)]
\]
\[\begin{aligned}
f_i
& =\sum\limits_{0 \leq j <i} (f_j+v_jval_{i-j}s_i-v_jval_{i-j}s_j) \\
& =\sum\limits_{0 \leq j <i} f_j+s_i\sum\limits_{0 \leq j <i} v_jval_{i-j}-\sum\limits_{0 \leq j <i} v_js_jval_{i-j}
\end{aligned}
\]
注意到这里面卷积部分并不需要用到 \(f_j\),故直接用 NTT 即可解决。
\(O(n \log n)\)。
1.3 应用-音游相关问题
P1654 OSU!
这题真是经典到不能再经典了……
相信大家都知道这题的 \(O(3n)\) 做法(记录 \(k\) 次方期望并转移)。但其实用 \(O(n\log n)\) 的时间复杂度就可以不局限于分数计算方式。
设判定依次为 \(a_i\)。
首先转化成划分类问题:定义一个段以连续的成功操作开头,再以一个失败操作结尾,即 \(a_{l_i}=1,a_{r_i}=0,\forall i \in [1,k]\)。
为了保证有定义,在所有操作最后再补一个必定失败的操作(即 \(p=0\)),为了防止除以 \(0\) 可以单独处理。
接下来就转化成了划分和问题。记 \(val_i=(i-1)^3\),定义划分的权值为:
\[w(P)=\sum\limits_{i=1}^k val_{r_i-l_i+1} \dfrac{1-p_{r_i}}{p_{r_i}} \prod_{t=l_i}^{r_i} p_t
\]
于是就转化成了上面的问题,使用 FFT,时间复杂度 \(O(n \log n)\)。
这题爆精度了只能拿 10 分……
2. 树上划分
给定一棵树,将树划分为若干联通块。形式化的,定义划分为 \(P=\{V_1,V_2,\cdots,V_k\}\),其中 \(V_i\) 代表某个联通块的点集。
由于无法枚举联通块,需要用类似树形依赖背包的思路来做。
下面就以划分积和为例,略过划分和。
2.1 联通块积和
P5206 [WC2019]数树
- 给定一棵大小为 \(n\) 的树,定义划分 \(P=\{V_1,V_2,\cdots,V_k\}\) 的权值为:
\[w(P)=\prod\limits_{i=1}^k|V_i|
\]
-
求所有划分的权值之和。
-
\(n \leq 10^5\)。
设 \(f_{u,i}\) 表示以 \(u\) 为根的子树中,根所在的联通块大小为 \(i\),不计算根所在联通块贡献的状态。
考虑转移过程,将子树 \(v\) 加入子树 \(u\) 中:
- 边 \((u,v)\) 不连,状态不变并计算 \(v\) 的贡献。
- 边 \((u,v)\) 连,状态改变并不计算贡献。
\[f_{u,i} \leftarrow f_{u,i} \sum\limits_{j=0}^n jf_{v,j} + \sum\limits_{j=0}^i f_{u,j}f_{v,i-j}
\]
预处理令 \(f_{u,1}=1\)。
朴素计算是 \(O(n^3)\) 的。
用个小 trick,枚举时只枚举到 \(size_u\),可以做到 \(O(n^2)\)。
我不满意!
这个形式非常的卷积,尝试把它写成生成函数。
\[F_u(x) \leftarrow F_u(x)F_v'(1)+F_u(x)F_v(x)
\]
再维护一下导数:
\[F_u'(x) \leftarrow F_v'(1)F_u'(x)+F_u'(x)F_v(x)+F_u(x)F_v'(x)
\]
最后要求的就是 \(F_1'(1)\),所以其实只需要维护 \(x=1\) 即可。
直接做到了 \(O(n)\),非常成功。
当然其实导数就是计算根所在联通块贡献的状态,似乎也可以直接理解跳过生成函数但是我理解不了。
2.2 复杂变式
- 给定一棵大小为 \(n\) 的树,\(m\) 次多项式 \(P(x)\) 与 \(t\),每个点有点权 \(w_i\),定义划分 \(P=\{V_1,V_2,\cdots,V_k\}\) 的权值为:
\[w(P)=\prod\limits_{i=1}^k P(\sum\limits_{u \in V_i} w_u)t^{\sum\limits_{u \in V_i} w_u}
\]
这个问题与朴素的 2.1 相比复杂了很多,不过实际上可以拆开来考虑。
首先后面那一小块其实把 2.1 中的 \(1\) 换成 \(t\) 即可。带权只需要在预处理时考虑即可(\(f_{u,w_u}=1\)),剩下只需要分别维护 \(1 \sim m\) 次导即可。
\[f_{u,i} \leftarrow f_{u,i} \sum\limits_{j} P(j)t^{j}f_{v,j} + \sum\limits_{j} f_{u,j}f_{v,i-j}
\]
先处理一下 \(P(x)\),设 \(\sum\limits_{i} P(i)g_ix^i=\sum\limits_{i=0}^m q_kG^{(i)}(x)\)。
由莱布尼茨公式:
\[[F(x)G(x)]^{(k)}=\sum\limits_{i=0}^k \dbinom{k}{i} F^{(i)}(x) G^{(k-i)}(x)
\]
于是可以维护 \(k\) 次导:
把所有 \(x\) 换成 \(t\) 就可以直接转移了,时间复杂度 \(O(nm^2)\)。
我不相信这个都还能够考虑意义来做了?
T169751 Nephren | Nephren 题解 - LawArthur&小落的博客
将连通块个数拆成选中点减去选中边,再用期望的线性计算,可以得到大小为 \(k\) 的连通块的贡献实际是一个确定的二次函数。
2.3 多元变式
以二元为例。
- 给定一棵大小为 \(n\) 的树,每个点有点权 \(a_i,b_i\),定义划分 \(P=\{V_1,V_2,\cdots,V_k\}\) 的权值为:
\[w(P)=\prod\limits_{i=1}^k (\sum\limits_{u \in V_i} a_u)(\sum\limits_{u \in V_i} b_u)
\]
-
求所有划分的权值之和。
-
\(n \leq 10^5\)。
这次有两个变量,因此需要多设一维。类似的,设状态为 \(f_{u,i,j}\)。
\[f_{u,i,j} \leftarrow f_{u,i,j} \sum\limits_{p} \sum\limits_{q} p q f_{v,p,q} + \sum\limits_{p} \sum\limits_{q} f_{u,p,q}f_{v,i-p,j-q}
\]
类似地定义求导 \(\dfrac{\partial}{\partial x\partial y}F(x,y)=\sum\limits_p \sum\limits_q pqf_{p,q}x^{p-1}y^{q-1}\)。
我不知道这叫啥……但貌似就是对两元依次求一次偏导,貌似写成 \(\frac{\partial}{\partial x\partial y}\)。
\[F_u(x,y) \leftarrow F_u(x,y) \dfrac{\partial}{\partial x\partial y}F_v(1,1)+F_u(x,y)F_v(x,y)
\]
乘法公式稍微麻烦一点,可以先对一维求偏导:
\[\dfrac{\partial}{\partial x}(FG)=F\dfrac{\partial}{\partial x}G+G\dfrac{\partial}{\partial x}F
\]
\[\dfrac{\partial}{\partial x\partial y}(FG)=\dfrac{\partial}{\partial y}F\dfrac{\partial}{\partial x}G+F\dfrac{\partial}{\partial x\partial y}G+\dfrac{\partial}{\partial y}G\dfrac{\partial}{\partial x}F+G\dfrac{\partial}{\partial x\partial y}F
\]
所以还需要维护 \(\dfrac{\partial}{\partial x}\) 和 \(\dfrac{\partial}{\partial y}\)。
-
\[\dfrac{\partial}{\partial x}F_u(x,y) \leftarrow \dfrac{\partial}{\partial x}F_u(x,y) \dfrac{\partial}{\partial x\partial y}F_v(1,1)+\dfrac{\partial}{\partial x}F_u(x,y)F_v(x,y)+F_u(x,y)\dfrac{\partial}{\partial x}F_v(x,y)
\]
-
\[\dfrac{\partial}{\partial y}F_u(x,y) \leftarrow \dfrac{\partial}{\partial y}F_u(x,y) \dfrac{\partial}{\partial x\partial y}F_v(1,1)+\dfrac{\partial}{\partial y}F_u(x,y)F_v(x,y)+F_u(x,y)\dfrac{\partial}{\partial y}F_v(x,y)
\]
-
\[\dfrac{\partial}{\partial x\partial y}F_u \leftarrow \dfrac{\partial}{\partial x\partial y}F_u \dfrac{\partial}{\partial x\partial y}F_v(1,1)+\dfrac{\partial}{\partial y}F_u\dfrac{\partial}{\partial x}F_v+F_u\dfrac{\partial}{\partial x\partial y}F_v+\dfrac{\partial}{\partial y}G\dfrac{\partial}{\partial x}F_u+F_v\dfrac{\partial}{\partial x\partial y}F_u
\]
这个式子太长了,统一写成 dp 式好看点:
-
\[f_u \leftarrow f_ur_v+f_uf_v
\]
-
\[g_u \leftarrow g_ur_v+g_uf_v+f_ug_v
\]
-
\[h_u \leftarrow h_ur_v+h_uf_v+f_uh_v
\]
-
\[r_u \leftarrow r_ur_v+h_ug_v+g_uh_v+f_ur_v+r_uf_v
\]
于是完备了,时间复杂度 \(O(n)\)。
注意到求导本质上是子集卷积,暴力做 \(k\) 元变式的时间复杂度是 \(O(2^{2k}n)\),可以用子集卷积优化到 \(O(2^kk^2n)\)。
2.4 更复杂的多元变式
由 T169751 Nephren 启发而来。
- 给定一棵大小为 \(n\) 的树,每个点有点权 \(w_i,p_i\)。
- 对于点集 \(T \subseteq S\) 定义 \(C(S,T)\) 表示点集 \(S\) 内 \(T\) 形成的联通块个数,定义划分 \(P=\{V_1,V_2,\cdots,V_k\}\) 的权值为:
\[w(P)=\sum\limits_{T} \prod\limits_{i=1}^k C(V_i,V_i \bigcap T)(\sum\limits_{i \in V_i}w_i)(\prod\limits_{i \in T}p_i)
\]
-
求所有划分的权值之和。
-
\(n \leq 10^5\)。
实际上就是把 T169751 Nephren 加了个点权,所以现在每个联通块的贡献不再相同,需要考虑多记录一维。
下面称 \(T\) 中的点为关键点。
直接考虑 \(f_{u,i,j,t}\) 分别表示根所在联通块的 \(w\) 权值之和为 \(i\),关键点联通块个数为 \(j\),根是否为关键点,不统计根所在联通块的答案。需要注意当两个根都是关键点时,联通块数量要减 \(1\)。
\[f_{u,i,j,0} \leftarrow f_{u,i,j,0} \sum\limits_{p} \sum\limits_{q} pq (f_{v,p,q,0}+f_{v,p,q,1})+\sum\limits_{p} \sum\limits_{q} f_{u,p,q,0} (f_{v,i-p,j-q,0}+f_{v,i-p,j-q,1})
\]
\[f_{u,i,j,1} \leftarrow f_{u,i,j,1} \sum\limits_{p} \sum\limits_{q} pq (f_{v,p,q,0}+f_{v,p,q,1})+\sum\limits_{p} \sum\limits_{q} f_{u,p,q,1} (f_{v,i-p,j-q,0}+f_{v,i-p,j-q+1,1})
\]
仿照 2.3 改写,为了板式这里就只写函数名了。
\[F0_u \leftarrow F0_u[\dfrac{\partial}{\partial x\partial y}F0_v(1,1)+\dfrac{\partial}{\partial x\partial y}F1_v(1,1)]+F0_u(F0_v+F1_v)
\]
\[F1_u \leftarrow F1_u[\dfrac{\partial}{\partial x\partial y}F0_v(1,1)+\dfrac{\partial}{\partial x\partial y}F1_v(1,1)]+F1_u(F0_v+\dfrac{1}{y}F1_v)
\]
仍然维护 \(\dfrac{\partial}{\partial x}\),\(\dfrac{\partial}{\partial y}\) 和 \(\dfrac{\partial}{\partial x\partial y}\)。
\[\dfrac{\partial}{\partial x}F0_u \leftarrow \dfrac{\partial}{\partial x}F0_u[\dfrac{\partial}{\partial x\partial y}F0_v(1,1)+\dfrac{\partial}{\partial x\partial y}F1_v(1,1)]+\dfrac{\partial}{\partial x}F0_u(F0_v+F1_v)+F0_u(\dfrac{\partial}{\partial x}F0_v+\dfrac{\partial}{\partial x}F1_v)
\]
\[\dfrac{\partial}{\partial x}F1_u \leftarrow \dfrac{\partial}{\partial x}F1_u[\dfrac{\partial}{\partial x\partial y}F0_v(1,1)+\dfrac{\partial}{\partial x\partial y}F1_v(1,1)]+\dfrac{\partial}{\partial x}F1_u(F0_v+\dfrac{1}{y}F1_v)+F1_u(\dfrac{\partial}{\partial x}F0_v+\dfrac{1}{y}\dfrac{\partial}{\partial x}F1_v)
\]
\[\dfrac{\partial}{\partial y}F0_u \leftarrow \dfrac{\partial}{\partial y}F0_u[\dfrac{\partial}{\partial x\partial y}F0_v(1,1)+\dfrac{\partial}{\partial x\partial y}F1_v(1,1)]+\dfrac{\partial}{\partial y}F0_u(F0_v+F1_v)+F0_u(\dfrac{\partial}{\partial y}F0_v+\dfrac{\partial}{\partial y}F1_v)
\]
\[\begin{aligned}
\dfrac{\partial}{\partial y}F1_u
& \leftarrow \dfrac{\partial}{\partial y}F1_u[\dfrac{\partial}{\partial x\partial y}F0_v(1,1)+\dfrac{\partial}{\partial x\partial y}F1_v(1,1)]+\dfrac{\partial}{\partial y}F1_u(F0_v+\dfrac{1}{y}F1_v)+F1_u(\dfrac{\partial}{\partial y}F0_v+\dfrac{\partial}{\partial y}\dfrac{1}{y}F1_v)\\
& =\dfrac{\partial}{\partial y}F1_u[\dfrac{\partial}{\partial x\partial y}F0_v(1,1)+\dfrac{\partial}{\partial x\partial y}F1_v(1,1)]+\dfrac{\partial}{\partial y}F1_u(F0_v+\dfrac{1}{y}F1_v)+F1_u(\dfrac{\partial}{\partial y}F0_v+\dfrac{1}{y}\dfrac{\partial}{\partial y}F1_v-\dfrac{1}{y^2}F1_v)
\end{aligned}
\]
\[\dfrac{\partial}{\partial x\partial y}F0_u \leftarrow \dfrac{\partial}{\partial x\partial y}F0_u[\dfrac{\partial}{\partial x\partial y}F0_v(1,1)+\dfrac{\partial}{\partial x\partial y}F1_v(1,1)]+\dfrac{\partial}{\partial x\partial y}F0_u(F0_v+F1_v)+F0_u(\dfrac{\partial}{\partial x\partial y}F0_v+\dfrac{\partial}{\partial x\partial y}F1_v)+\dfrac{\partial}{\partial x}F0_u(\dfrac{\partial}{\partial y}F0_v+\dfrac{\partial}{\partial y}F1_v)+\dfrac{\partial}{\partial y}F0_u(\dfrac{\partial}{\partial x}F0_v+\dfrac{\partial}{\partial x}F1_v)
\]
\[\begin{aligned}
\dfrac{\partial}{\partial x\partial y}F1_u
& \leftarrow \dfrac{\partial}{\partial x\partial y}F1_u[\dfrac{\partial}{\partial x\partial y}F0_v(1,1)+\dfrac{\partial}{\partial x\partial y}F1_v(1,1)]+\dfrac{\partial}{\partial x\partial y}F1_u(F0_v+\dfrac{1}{y}F1_v)+F1_u(\dfrac{\partial}{\partial x\partial y}F0_v+\dfrac{\partial}{\partial x\partial y}\dfrac{1}{y}F1_v)+\dfrac{\partial}{\partial x}F1_u(\dfrac{\partial}{\partial y}F0_v+\dfrac{\partial}{\partial y}\dfrac{1}{y}F1_v)+\dfrac{\partial}{\partial y}F1_u(\dfrac{\partial}{\partial x}F0_v+\dfrac{\partial}{\partial x}\dfrac{1}{y}F1_v)\\
& =\dfrac{\partial}{\partial x\partial y}F1_u[\dfrac{\partial}{\partial x\partial y}F0_v(1,1)+\dfrac{\partial}{\partial x\partial y}F1_v(1,1)]
+\dfrac{\partial}{\partial x\partial y}F1_u(F0_v+\dfrac{1}{y}F1_v)
+F1_u(\dfrac{\partial}{\partial x\partial y}F0_v+\dfrac{1}{y}\dfrac{\partial}{\partial x\partial y}F1_v-\dfrac{1}{y^2}\dfrac{\partial}{\partial x}F1_v)
+\dfrac{\partial}{\partial x}F1_u(\dfrac{\partial}{\partial y}F0_v+\dfrac{1}{y}\dfrac{\partial}{\partial y}F1_v-\dfrac{1}{y^2}F1_v)
+\dfrac{\partial}{\partial y}F1_u(\dfrac{\partial}{\partial x}F0_v+\dfrac{1}{y}\dfrac{\partial}{\partial x}F1_v)
\end{aligned}
\]
已经完备,时间复杂度 \(O(n)\)。