【题目描述】
给定一棵 n 个结点的有根树,其中结点 1 为根,结点 i(2≤i≤n)的父亲结点为结点 pi。
对于 1≤i≤n,定义结点 i 的深度 di 为结点 1 到结点 i 的简单路径的边数。也就是说,d1=0,di=dpi+1(2≤i≤n)。定义有根树的高度 h 为所有结点深度的最大值,即 h=maxi=1ndi。
给定高度的上界 m。在本题中,给定的有根树的高度不超过 m。
每个结点 u 有一个整数权值 au。另外,给定一个长度为 n 的整数序列 b1,b2,…,bn,其中 bj 表示长度为 j 的链对应的价值系数。权值 au 与价值系数 bj 均可能为负数。
若一个结点没有儿子,则称这个结点为叶子。设树中共有 k 个叶子。小 X 会选择一个由所有叶子组成的排列 q1,q2,…,qk,并按照这个顺序依次探索这些叶子。这个排列称为一个探索序列。
当小 X 探索叶子 qi 时,会观察从根到 qi 的简单路径,并取出这条路径上此前从未被探索过的所有结点,记这些结点组成的集合为 Si。此前已经探索过的所有根到叶路径构成一棵包含根的连通子树,因此 Si 中的结点一定构成一条连续的、从上向下的链,称为第 i 次探索的新探索链。
令 ti 表示 Si 中深度最小的结点,li=∣Si∣ 表示这条新探索链的长度。定义第 i 次探索产生的探索价值为 atibli,并定义这个探索序列的总价值为
i=1∑katibli.
定义这棵树的价值为所有探索序列的总价值的最大值。
你需要求出给定有根树的价值。
【输入格式】
本题包含多组测试数据。
从文件 tree.in 中读入数据。
输入的第一行包含一个非负整数 c 与一个正整数 T,分别表示测试点编号与测试数据组数。c=0 表示该测试点为样例。
接下来依次输入每组测试数据。对于每组测试数据:
第一行包含两个正整数 n,m,分别表示结点数量与高度的上界。
第二行包含 n−1 个正整数 p2,p3,…,pn,分别表示每个结点的父亲结点。
第三行包含 n 个整数 a1,a2,…,an,分别表示每个结点的权值。
第四行包含 n 个整数 b1,b2,…,bn,分别表示不同链长对应的价值系数。
【输出格式】
输出到文件 tree.out 中。
对于每组测试数据,输出一行一个整数,表示给定有根树的价值。
【样例 1 输入】
10 225 231 1 2 243 -2 4 5 152 -1 3 0 064 371 2 38-3 2 -1 597 0 2 -4
【样例 1 输出】
【说明/提示】
【样例 1 解释】
对于第一组测试数据,树中的叶子为结点 3,4,5。
小 X 可以选择探索序列 5,3,4。第一次探索叶子 5 时,S1={1,2,5},产生的探索价值为 a1b3=3×3=9。第二次探索叶子 3 时,S2={3},产生的探索价值为 a3b1=4×2=8。第三次探索叶子 4 时,S3={4},产生的探索价值为 a4b1=5×2=10。
这个探索序列的总价值为 9+8+10=27。可以证明,不存在总价值更大的探索序列,因此这棵树的价值为 27。
对于第二组测试数据,结点 4 是唯一的叶子。唯一的探索序列为 4,此时 S1={1,2,3,4},产生的探索价值为 a1b4=(−3)×(−4)=12,因此这棵树的价值为 12。
【样例 2】
见选手目录下的 tree/tree2.in 和 tree/tree2.ans。
该附加样例满足测试点 3,4 的数据范围。
【样例 3】
见选手目录下的 tree/tree3.in 和 tree/tree3.ans。
该附加样例满足测试点 13,14 的数据范围。
【样例 4】
见选手目录下的 tree/tree4.in 和 tree/tree4.ans。
该附加样例满足测试点 18,19 的数据范围。
【样例 5】
见选手目录下的 tree/tree5.in 和 tree/tree5.ans。
该附加样例满足测试点 20∼25 的数据范围。
【数据范围】
对于所有测试数据,保证:
- 0≤c≤25,1≤T≤5。
- 2≤n≤8×103,1≤m≤min(n−1,800)。
- 对于所有 2≤i≤n,均有 1≤pi≤i−1。
- 给定的有根树的高度不超过 m。
- 对于所有 1≤i≤n,均有 −106≤ai,bi≤106。