P8290 [省选联考 2022] 填树
题目大意:
有一棵 \(n\) 个节点的无根树,刚开始树上每个节点的权值均为 \(0\)。KK 想对这棵树进行一些修改,他会任选一个节点作为初始的当前节点,然后重复以下动作:
- 将当前节点 \(i\) 的权值修改为一个正整数 \(x\),需满足 \(l_i \leq x \leq r_i\)。其中 \(l_i, r_i\) 是输入中给出的两个正整数。
- 结束修改过程,或移动到一个与当前节点相邻的权值为 \(0\) 的节点(如果不存在这样的节点,则必须结束修改过程)。
现在 KK 有两个问题:
-
在修改结束后,可以得到多少棵不同的树,满足树上非零权值的最大值和最小值的差小于等于 \(K\)?其中 \(K\) 是输入中给出的一个正整数。
-
这些满足条件的树的权值之和为多少?(树的权值定义为这棵树上所有节点的权值之和)
你需要输出这两个问题的答案模 \(10^9 + 7\)。我们认为两棵树不同当且仅当至少存在一个节点的权值不同。
温馨提示:
- KK 至少会修改一个节点(初始节点)。
- 实质上 KK 会修改树上的任意一条路径,最后需要满足这条路径上的点的权值最大值和最小值之差小于等于 \(K\)。
总结:
一道非常好的\(dp\)题目
首先我们考虑,如果钦定的我们选择的范围为\([l,r]\),然后就直接树形\(dp\)就可以求出方案数和权值和
我们发现\([l,r]\)与区间\([l+1,r+1]\)在计算的时候会将\([l+1,r]\)算重,这个去重是容易的,直接求一遍\(k-1\)时候的情况就可以了
但是因为权值范围很大,所以我们考虑直接枚举的时间复杂度很大
如果我们把区间左端点看成未知数\(x\),那么区间\([x,x+k]\)与每一个点的取值范围的交是可以通过分类讨论得到的
在分类讨论之后,我们考虑每一个点的贡献其实是一个关于\(x\)的多项式,相当于对于答案的贡献会是一个多项式,这无论对于方案数还是权值和都是成立的
然后我们考虑在求的时候,因为最后我们贡献到的是一段前缀和,我们将前缀和视为一个新的函数,因为\(n\)次多项式前缀和为\(n+1\)次,所以我们使用拉格朗日插值直接求解就行
接下来是对于“\(n\)次多项式前缀和为\(n+1\)次”的证明:

--from @天命之路
时间复杂度为\(\Theta(n^3)\)

浙公网安备 33010602011771号