#L3701. 「联合省选 2022」填树

    ID: 4363 传统题 4000ms 512MiB 尝试: 6 已通过: 1 难度: 10 上传者: 标签>动态规划树形DP区间DP树结构树的分治DFS序列其他离散化数学思维组合数学容斥原理难度NOI/NOI+多项式

「联合省选 2022」填树

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

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

现在 KK 有两个问题:

  1. 在修改结束后,可以得到多少棵不同的树,满足树上非零权值的最大值和最小值的差小于等于 KK?其中 KK 是输入中给出的一个正整数。
  2. 这些满足条件的树的权值之和为多少?(树的权值定义为这棵树上所有节点的权值之和)

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

温馨提示:

  • KK 至少会修改一个节点(初始节点)。
  • 实质上 KK 会修改树上的任意一条路径,最后需要满足这条路径上的点的权值最大值和最小值之差小于等于 KK

输入格式
从文件 tree.in 中读入数据。

第一行两个正整数 n,Kn, K,表示节点数和权值差的最大值。

接下来 nn 行,每行两个正整数 li,ril_i, r_i,表示第 ii 个节点修改后权值的最小值和最大值。

接下来 n1n - 1 行,每行两个正整数 ui,viu_i, v_i,表示节点 uiu_iviv_i 之间有一条边。数据保证形成一棵树。


输出格式
输出到文件 tree.out 中。

输出两行,每行一个整数,分别表示第一问和第二问的答案模 109+710^9 + 7 的值。注意,如果你不打算回答第二问,请在第二行任意输出一个整数。如果输出文件只有一行,则会因格式不符合要求被判 00 分。


样例 1
输入:

3 1
2 3
3 5
4 6
1 2
1 3

输出:

14
78
编号 1 2 3 4 5 6 7 8 9 10 11 12 13 14
节点1 2 3 2 3 3 3 0 0
节点2 0 3 4 0 4 3 4 5
节点3 0 4 4 0 4 5 6

表格中列出了全部 1414 棵满足条件的树,将这些树的权值加起来为 7878


样例 2
见附加文件 tree2.intree2.ans


样例 3
见附加文件 tree3.intree3.ans


数据范围与提示
对于 100%100\% 的数据,1n2001 \le n \le 2001liri1091 \le l_i \le r_i \le 10^91K1091 \le K \le 10^9

测试点 nn\le ri,Kr_i,K\le 其他限制
1 5 10
2~3 30 10910^9
4 500
5~6 200 2×1052\times 10^5
7~8 10910^9 A
9~10

特殊限制 A:所有点构成一条链,编号为 ii 的点和编号为 i+1i + 1 的点之间有连边。

评分方式
本题共 1010 个测试点,每个测试点 1010 分。其中回答正确第一问可得 77 分,回答正确第二问可得 33 分。