CF995F Cowmpany Cowmpensation

题意

树形结构n个点(n<=3000),给每个节点分配权值,子节点不能超过父亲节点的权值,问有多少种分配方案。每个节点工资上限为d(d<=1e9).

 题解

先考虑暴力dp

设f[i][j]表示钦定第i个点工资为j第i个点子树的方案树

得到转移方程$f[i][j]=\prod_{son} \sum_{k=1}^j f[son][k]$

进一步优化,设g[i][j]为f[i][j]在j这一维的前缀和。

则$f[i][j]=\prod_{son} g[son][k]$

考虑优化方法。

看起来无法改变枚举顺序,故无法使用矩阵快速幂优化。

对于第二维极大的,看看能否能用拉格朗日插值优化。

即,我们假设g[i]存储的不再是一个数组,而是一个关于j的多项式,这个多项式的功能就是把任意一个j带入多项式中,得到的值就是原来的g[i][j]。(请注意把这个多项式和生成函数区别开来)

我们现在需要知道该多项式项数至多是多少。

考虑对于每一个叶子结点,无论j是多少,它的f[i][j]始终是1,则g[i][j]=j。即g[i]线性递增,是一个一次函数。

观察

$g[i][j]=\sum_{k=1}^jf[i[j]=\sum_{k=1}^j\prod_{son} g[son][k]$

那么g[i][j]的次数至多等于g[son][k]的次数之和+1(连乘之后还有一个包含j项的求和,j是多项式的主元,所以要加1),也就是一个size[i]次多项式。

然后我们先dp出g[1][1~n],再插值求出g[1][d]即可。

 然而一般而言插值时证明最高次数不需要如此严谨,考场一般靠猜(逃

posted @ 2021-08-17 09:35  linzhuohang  阅读(24)  评论(0编辑  收藏  举报