CF1098A Sum in the tree

题目描述

Mitya 有一棵有根树,包含 $n$ 个顶点,顶点编号从 $1$ 到 $n$,根节点编号为 $1$。每个顶点 $v$ 上最初写有一个整数 $a_v \ge 0$。对于每个顶点 $v$,Mitya 计算了 $s_v$:即从顶点 $v$ 到根节点路径上所有顶点的 $a$ 值之和,以及 $h_v$——顶点 $v$ 的深度,表示从顶点 $v$ 到根节点路径上的顶点数。显然,$s_1 = a_1$ 且 $h_1 = 1$。 随后,Mitya 擦除了所有的 $a_v$,并且不小心还擦除了所有深度为偶数的顶点(即 $h_v$ 为偶数的顶点)的 $s_v$ 值。你的任务是还原每个顶点的 $a_v$ 值,或者判断 Mitya 是否出错。如果有多种还原方式,你需要找到一种使得所有顶点 $a_v$ 之和最小的方案。

输入格式

第一行包含一个整数 $n$,表示树的顶点数($2 \le n \le 10^5$)。 第二行包含 $p_2, p_3, \ldots, p_n$,其中 $p_i$ 表示编号为 $i$ 的顶点的父节点编号($1 \le p_i < i$)。 最后一行包含整数 $s_1, s_2, \ldots, s_n$($-1 \le s_v \le 10^9$),被擦除的值用 $-1$ 替代。

输出格式

输出一个整数,表示原树中所有 $a_v$ 值的最小总和。如果不存在这样的树,输出 $-1$。

说明/提示

由 ChatGPT 4.1 翻译