浅谈划分类问题

一篇小总结,已放入 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!

  • \(n\) 次操作,每次操作有成功与失败两种判定。

  • 每个长度为 \(l\) 的极长成功连续段贡献 \(l^3\) 分数。

  • 给出每个操作成功的概率,求分数期望。

  • \(n \leq 10^5\)


这题真是经典到不能再经典了……

相信大家都知道这题的 \(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\) 即可。

  • \[F_u(1) \leftarrow F_u(1)F_v'(1)+F_u(1)F_v(1) \]

  • \[F_u'(1) \leftarrow F_v'(1)F_u'(1)+F_u'(1)F_v(1)+F_u(1)F_v'(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} \]

  • 求所有划分的权值之和。

  • \(n \leq 10^5\)\(m \leq 10\)

这个问题与朴素的 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_u(x) \leftarrow F_u(x)\sum\limits_{i=0}^m q_iF_v^{(i)}(t)+F_u(x)F_v(x) \]

由莱布尼茨公式:

\[[F(x)G(x)]^{(k)}=\sum\limits_{i=0}^k \dbinom{k}{i} F^{(i)}(x) G^{(k-i)}(x) \]

于是可以维护 \(k\) 次导:

  • \[F_u^{(k)}(x) \leftarrow F_u^{(k)}(x)\sum\limits_{i=0}^m q_iF_v^{(i)}(t)+\sum\limits_{i=0}^k \dbinom{k}{i} F_u^{(i)}(x) F_v^{(k-i)}(x) \]

把所有 \(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)\)

posted @ 2021-09-20 19:23  苹果蓝17  阅读(177)  评论(0编辑  收藏  举报