CF995F Cowmpany Cowmpensation

发布时间 2023-07-20 18:34:56作者: Ender_32k

拉插优化 dp 在卷怪们眼里已经变成套路了吗,害怕。

考虑一个 dp 的推。设 \(f_{u,i}\) 表示 \(u\) 子树中填 \([1,i]\) 符合题目条件的方案数,此时不强制 \(u\)\(i\),所以有:

\[f_{u,i}=f_{u,i-1}+\prod\limits_{v\in \text{son}(u)}f_{v,i} \]

直接做是 \(O(nd)\) 的。考虑奇技淫巧优化。

考虑到边界情况,就是 \(u\) 为叶子时,\(f_{u,i}=i\),这是个关于 \(i\)一次函数

同时这个转移形式比较诡异,是儿子的值全部乘积然后求和。那么如果设 \(u\)\(f_{u,i}\) 是关于 \(i\)\(g_u\) 次函数的话,对于树上任意一个非叶节点:

\[\begin{aligned}g_u&=1+\deg \left(\prod\limits_{v\in \text{son}(u)}f_{v,i}\right)\\&=1+\sum\limits_{v\in \text{son(u)}}g_v\end{aligned} \]

由于 \(v\) 是叶子时 \(g_v=1\),我们容易归纳出 \(g_u=\text{sz}_u\),即 \(u\)子树大小。于是 \(f_{u,i}\) 是关于 \(i\)\(\text{sz}_u\) 次函数。

如果 \(d\le n+1\),直接暴力 dp;否则处理出 \(f_{n,1}\)\(f_{n,n+1}\) 的值,用拉格朗日插值把 \(f_{n,d}\) 插出来即可。

复杂度 \(O(n^2)\)