Loading

[2025 GD省训]小方的疑惑 题解

题意简述

给定一棵 \(n\) 个点的有根树,每个点初始权值 \(a_i\)
可以进行以下操作任意次:

  • 选择一个非叶结点 \(x\) 满足 \(a_x>0\)\(x\) 的一个子结点 \(y\),令 \(a_x\leftarrow a_x-1,a_y\leftarrow a_y+1\)

求最终可能的 \(a\) 序列数量。

\(n\leq 8000,a_i\leq 10^9\)

\(a_i=1,n\leq 500\)

先考虑 \(\forall i,a_i=1\) 的情况。

先考察最终的 \(a\) 序列由什么决定。对于一个操作序列 \((x_i,y_i)\),将其按照 \(x_i\) 的深度排序后也一定是合法的(也就是不在对 \(a_x=0\)\(x\) 操作)。那么相当于按照深度遍历每个点,对每个点 \(x\) 将当前的 \(a_x\) 分成不小于 \(0\) 的若干份加到每个子结点上,剩下的(也要 \(\geq 0\))作为最终的 \(a_x\)

不难发现这样操作和最终的 \(a\) 序列一一对应。对操作过程 dp。设 \(f_{x,i}\) 表示 \(a_x\) 被父结点额外加了 \(i\)\(x\) 所在子树的方案数,设 \(x\) 的子结点为 \(y_1,y_2,\dots,y_k\) 那么就有转移:

\[f_{x,i}=\sum_{b_1+b_2+\dots+b_k\leq a_x+i}\prod_{j=1}^k f_{y_j,b_j} \]

显然 \(i\leq dep_x\),所以复杂度为 \(O(n^3)\)

\(n\leq 500\)

现在 \(a\) 很大,刚才 dp 的第二维太大了记不下来,直接 dp 行不通。

这个 \(a\) 太大了,可以猜想对于每个 \(u\)\(f_{u,i}\) 是关于 \(i\) 的函数。对于叶结点,有 \(f_{u,i}=1\),对于非叶结点,转移形如 \(f^{\prime}_{u,i}=\sum_{j=0}^i f_{u,j}f_{v,i-j}\)。可以猜想,\(f_{u,i}\) 为关于 \(i\) 的多项式,更进一步,多项式次数为 \(siz_u-1\),这可以由上面的转移证明。

那么现在我们改写一下 \(a_i=1\) 部分的转移:

\[f^{\prime}_{x,i}=\sum_{b_1+b_2+\dots+b_k\leq i}\prod_{j=1}^k f_{y_j,b_j}\\ f_{x,i}=f^{\prime}_{x,i+a_x} \]

现在只需要在上面的背包中计算出 \(i<siz_x\) 的值,然后通过插值求出 \(i+a_x\) 处的值即可,背包复杂度大概是 \(O(n^3)\),插值复杂度是 \(O(\sum siz^2)\)

\(n\leq 8000\)

上面的做法用到了插值,这忽略了太多性质,复杂度难以改进。

下面所有的函数自变量均为自然数。

我们将 \(f\) 改写成 \(f_u(i)\) 的形式,以更好的说明这是关于 \(i\) 的多项式,那么有 \(f_u(x)=\sum_{i=0}^{siz_u-1}c_ix^i\),那么背包转移形如:

\[f_u(x)=\sum_{i=0}^x f_v(i)f_w(x-i)=\sum_{j<siz_v}\sum_{k<siz_w}c_{v,j}c_{w,k}\sum_{i=0}^xi^j(x-i)^k \]

上面的背包就相当于先令 \(f_u(x)=1\),然后依次和每个子结点的 \(f\) 用这种方式卷起来。

最后这部分 \(i^j(x-i)^k\) 看起来就不好算,必须转化形式。

考虑如何证明 \(\deg f_u=\deg f_v+\deg f_w+1\)。众所周知,对于多项式 \(f(x)\),计算前缀和 \(s(x)=\sum_{i=0}^xf(i)\),那么 \(s(x)\) 也是多项式且 \(\deg s =\deg f+1\)。而对于多项式 \(f_w(x)\),可以改写成 \(f_w(x)=\sum_{i=0}^{siz_w-1}c_{w,i}\binom{x+i}{i}\)(因为 \(\binom{x+i}{i}\) 实际上是 \(x\)\(i\) 次多项式),而对于任意多项式 \(f(x)\),函数 \(s_k(x)=\sum_{i=0}^xf(i)\binom{x-i+k}{k}\) 实际上就是对 \(f\) 进行 \(k+1\) 次前缀和的结果,所以 \(\deg s_k=\deg f+k+1\)

对于 \(s_k\)\(k+1\) 次前缀和的证明,下面提供组合意义和生成函数两种:

  1. 考虑组合意义:对 \(f\) 做一次前缀和,\(f(j)\) 会对所有 \(i\geq j\) 有一次贡献。那么 \(f(j)\)\(s_k(i)\) 的贡献,相当于序列 \(j\leq i_0\leq i_1\leq\dots\leq i_k=i\) 的数量,插板法得到 \(\binom{i-j+k}{k}\)
  2. 考虑生成函数:考虑 \(F(x)=\sum_if(i)x^i,G_k(x)=\frac{1}{(1-x)^{k+1}},S_k(x)=\sum_is_k(i)x^i\)\(F\times G_k\) 显然确实是 \(F\)\(k+1\) 次前缀和。而由广义二项式定理,有 \([x^i]G=\binom{-(k+1)}{i}=\binom{k+i}{i}=\binom{k+i}{k}\),即 \(G_k(x)\) 即为 \(\binom{i+k}{k}\) 的生成函数,故 \(S_k=F\times G_k\)

这提示我们维护 \(f_u(x)=\sum_{i=0}^{siz_u-1}c_{u,i}\binom{x+i}{i}\) 的形式(这里的 \(c\) 和前面的 \(c\) 不一定相等),那么现在背包卷积就变成了前缀和,而对这个组合数做前缀和也是容易的,具体的有 \(\sum_{y=0}^x\binom{y+i}{i}=\binom{x+i+1}{i+1}\),也就是说一次前缀和相当于将 \(c\) 右移一位。那么 \(f_v\ast f_w\)(这里的 \(\ast\) 是对点值做卷积,也就是上面的背包)就是将 \(c_v\) 分别右移 \(1,2,\dots,\deg f_w+1\) 位并乘上对应的 \(c_w\) 后加起来,复杂度 \(O((\deg f_v+\deg f_w)\deg f_w)\),不妨让 \(\deg f_v\geq \deg f_w\),则复杂度为 \(O(\deg f_v\times\deg f_w)\)

上面的卷积总复杂度由树形背包已经是 \(O(n^2)\) 了,但是还没有处理平移操作。在求出 \(f^{\prime}_u(x)\) 后,我们还要将其往左平移 \(a_u\),也就是 \(f_u(x)=f^{\prime}(x+a_u)\)

考虑暴力平移,也就是求 \(b\) 满足 \(\sum_ic_i\binom{x+a+i}{i}=\sum_ib_i\binom{x+i}{i}\)。对于 \(\binom{x+a+i}{i}\),有 \(\binom{x+a+i}{i}=\sum_{j=0}^i\binom{x+a-1+j}{j}\),也就是平移一位实际上就是一次前缀和。那么平移 \(a\) 位的结果上面已经算过了,就是 \(\binom{x+a+i}{i}=\sum_{j=0}^i\binom{x+i}{i}\binom{a-1+i-j}{i-j}\)。所以暴力平移一次复杂度为 \(\deg^2\)

直接对每个子树暴力平移复杂度还是三次方。考虑打个平移标记,维护形如 \(f_u(x+a)\),但问题是 \(f_v(x+a_1)\ast f_u(x+a_2)\) 失去了前缀和的性质。不过注意到,\(f_v(x+a)\ast f_w(x)\) 仍然可以表示成前缀和,而对 \(f_v(x+a)\) 做前缀和也是容易的,具体的有 \(\sum_{y=0}^xf_v(y+a)=\binom{x+a+i+1}{i+1}-\binom{a+i}{i+1}\),也就是将 \(c\) 右移一位后常数项变为原来的 \(-\sum_{i=0}c_i\binom{a+i}{i+1}\)

那么考虑重剖,将 \(u\) 的所有子树卷起来时,将所有轻子树暴力平移,然后和(带标记的)重子树卷起来,复杂度是 \(O(\sum_{v\in light_u}(siz_v^2+siz_vsiz_{heavy_u}))=O(\sum_{v\in light_u}siz_vsiz_{heavy_u})\)

总复杂度 \(O(n^2)\),可以通过。

posted @ 2025-04-29 19:49  complexor  阅读(42)  评论(0)    收藏  举报