P8290 [省选联考 2022] 填树

P8290 [省选联考 2022] 填树

题目大意:

有一棵 \(n\) 个节点的无根树,刚开始树上每个节点的权值均为 \(0\)。KK 想对这棵树进行一些修改,他会任选一个节点作为初始的当前节点,然后重复以下动作:

  1. 将当前节点 \(i\) 的权值修改为一个正整数 \(x\),需满足 \(l_i \leq x \leq r_i\)。其中 \(l_i, r_i\) 是输入中给出的两个正整数。
  2. 结束修改过程,或移动到一个与当前节点相邻的权值为 \(0\) 的节点(如果不存在这样的节点,则必须结束修改过程)。

现在 KK 有两个问题:

  1. 在修改结束后,可以得到多少棵不同的树,满足树上非零权值的最大值和最小值的差小于等于 \(K\)?其中 \(K\) 是输入中给出的一个正整数。

  2. 这些满足条件的树的权值之和为多少?(树的权值定义为这棵树上所有节点的权值之和)

你需要输出这两个问题的答案模 \(10^9 + 7\)。我们认为两棵树不同当且仅当至少存在一个节点的权值不同。

温馨提示:

  1. KK 至少会修改一个节点(初始节点)。
  2. 实质上 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\)次”的证明:

image

--from @天命之路

时间复杂度为\(\Theta(n^3)\)

代码

posted @ 2023-10-08 15:26  AntelopeWang  阅读(13)  评论(0)    收藏  举报