time limit per test

2 seconds

memory limit per test

256 megabytes

input

standard input

output

standard output

Mitya has a rooted tree with nn vertices indexed from 11 to nn, where the root has index 11. Each vertex vv initially had an integer number av≥0av≥0 written on it. For every vertex vv Mitya has computed svsv: the sum of all values written on the vertices on the path from vertex vv to the root, as well as hvhv — the depth of vertex vv, which denotes the number of vertices on the path from vertex vv to the root. Clearly, s1=a1s1=a1 and h1=1h1=1.

Then Mitya erased all numbers avav, and by accident he also erased all values svsv for vertices with even depth (vertices with even hvhv). Your task is to restore the values avav for every vertex, or determine that Mitya made a mistake. In case there are multiple ways to restore the values, you're required to find one which minimizes the total sum of values avav for all vertices in the tree.

Input

The first line contains one integer nn — the number of vertices in the tree (2≤n≤1052≤n≤105). The following line contains integers p2p2, p3p3, ... pnpn, where pipi stands for the parent of vertex with index ii in the tree (1≤pi<i1≤pi<i). The last line contains integer values s1s1, s2s2, ..., snsn (−1≤sv≤109−1≤sv≤109), where erased values are replaced by −1−1.

Output

Output one integer — the minimum total sum of all values avav in the original tree, or −1−1 if such tree does not exist.

Examples
input

Copy
5
1 1 1 1
1 -1 -1 -1 -1
output

Copy
1
input

Copy
5
1 2 3 1
1 -1 2 -1 -1
output

Copy
2
input

Copy
3
1 2
2 -1 1
output

Copy
-1

题意就是给你一个有根树,然后给你每个节点的父亲,然后给你每个节点到根节点的点权之和,然后就是偶数深度的节点的到根节点的点权之和被抹去了,是-1,让你将这个树还原,然后求出所有节点的最小点权之和。

因为是隔一层就断了,所以直接直接给偶数深度节点爸爸赋值他儿子的值中最小的那个,然后,儿子-爸爸的值算出每个点的点权,最后加起来就可以了。如果节点的值是负数,就是不满足条件的,直接-1输出就可以了。我写的时候,wa了好久,搞不清楚为什么,不用开long long吧,我不开会wa,然后就是如果一个节点是直接连接根节点的,他没有儿子,那么我们可以给他赋值为0,我这里写早了,写到dfs出来时每个节点的点权之前了,这样算出来的肯定是不对的,就是直接0-根节点的权值,肯定是错的,当时想的是算完之后再处理这些特殊的点,但是手抖写的时候写挫了,改了就过了。

代码:

 //D
#include<iostream>
#include<cstring>
#include<cstdio>
#include<cmath>
#include<algorithm>
#include<cstdlib>
using namespace std;
typedef long long ll;
const int inf=0x3f3f3f3f;
const int maxn=2e5+; struct node{
int to,val,next;
}edge[maxn<<]; int head[maxn<<],dep[maxn],fa[maxn][],cnt;
int dis[maxn]; void add(int x,int y,int v){edge[++cnt].to=y,edge[cnt].val=v,edge[cnt].next=head[x],head[x]=cnt;}//存图 void dfs(int u,int fath)
{
dep[u]=dep[fath]+;
for(int i=head[u];i;i=edge[i].next){
int v=edge[i].to,w=edge[i].val;
if(v!=fath){
dis[v]=w;
if(dep[u]%==){
dis[u]=min(dis[u],dis[v]);//找子节点的值的最小值
}
}
}
for(int i=head[u];i;i=edge[i].next){
int v=edge[i].to,w=edge[i].val;
if(v!=fath){
dfs(v,u);
if(dis[v]!=inf)//如果不是特殊节点
dis[v]=dis[v]-dis[u];//当前点的点权就是自己-爸爸的
}
}
} int a[maxn],b[maxn]; int main()
{
int n;
cin>>n;
for(int i=;i<=n;i++)
cin>>a[i];
for(int i=;i<=n;i++){
cin>>b[i];
if(b[i]==-) b[i]=inf;
}
for(int i=;i<=n;i++){
add(a[i],i,b[i]);
add(i,a[i],b[i]);
}
dis[]=b[];
dfs(,);
for(int i=;i<=n;i++){
if(dis[i]==inf) dis[i]=;//如果是特殊节点,处理完还是没确定值的,就赋值为0
}
// for(int i=1;i<=n;i++)
// cout<<dis[i]<<endl;
ll ans=;
int flag=;
for(int i=;i<=n;i++){
if(dis[i]<){
flag=;break;
}
ans+=dis[i];
}
if(flag==) cout<<ans<<endl;
else cout<<-<<endl;
} /*
10
1 1 1 1 2 3 4 5 1
3 -1 -1 -1 -1 3 3 3 3 -1 3
*/

Codeforces 1099 D. Sum in the tree-构造最小点权和有根树 贪心+DFS(Codeforces Round #530 (Div. 2))的更多相关文章

  1. Codeforces Round #530 (Div. 2):D. Sum in the tree (题解)

    D. Sum in the tree 题目链接:https://codeforces.com/contest/1099/problem/D 题意: 给出一棵树,以及每个点的si,这里的si代表从i号结 ...

  2. Codeforces Round #530 (Div. 2) D. Sum in the tree 树上贪心

    D. Sum in the tree 题意 给出一颗树,奇数层数的点有值,值代表从1到该点的简单路的权值的和,偶数层数的点权值被擦去了 问所有节点的和的最小可能是多少 思路 对于每一个-1(也就是值未 ...

  3. Codeforces Round #530 (Div. 1) 1098A Sum in the tree

    A. Sum in the tree Mitya has a rooted tree with nn vertices indexed from 11 to nn, where the root ha ...

  4. Codeforces Round #530 (Div. 2) A,B,C,D

    A. Snowball 链接:http://codeforces.com/contest/1099/problem/A 思路:模拟 代码: #include<bits/stdc++.h> ...

  5. Codeforces Round #530 (Div. 1)

    A - Sum in the tree 就是贪心选尽量让上面的点权尽量大,那么对于偶数层的点,其到根节点的和即为所有儿子中的最大值. #include<bits/stdc++.h> usi ...

  6. Codeforces Round #530 (Div. 2) Solution

    A. Snowball 签. #include <bits/stdc++.h> using namespace std; ], d[]; int main() { while (scanf ...

  7. Codeforces Round #530 (Div. 2)

    RANK :2252 题数 :3 补题: D - Sum in the tree 思路:贪心 把权值放在祖先节点上 ,预处理 每个节点保存 他与他儿子中 权值最小值即可. 最后会有一些叶子节点依旧为 ...

  8. Codeforces 1099 C. Postcard-字符串处理(Codeforces Round #530 (Div. 2))

    C. Postcard time limit per test 1 second memory limit per test 256 megabytes input standard input ou ...

  9. Codeforces 1099 B. Squares and Segments-思维(Codeforces Round #530 (Div. 2))

    B. Squares and Segments time limit per test 1 second memory limit per test 256 megabytes input stand ...

随机推荐

  1. 用Apache Spark和TensorFlow进行的深度学习

    原文:https://databricks.com/blog/2016/01/25/deep-learning-with-apache-spark-and-tensorflow.html by Tim ...

  2. redis初试Not all 16384 slots are covered by nodes

    按照这里的步骤玩redis集群,http://www.redis.cn/topics/cluster-tutorial.html ./src/redis-trib.rb create --replic ...

  3. [USACO13FEB]出租车Taxi

    洛谷题目链接:[USACO13FEB]出租车Taxi 题目描述 Bessie is running a taxi service for the other cows on the farm. The ...

  4. Ubuntu12.04 GIT安装和使用

    一.安装GIT和配置GIT 1.安装GIT apt-get install git 2.配置GIT ##配置用户信息 git config --global user.name "John ...

  5. Java面试知识总结三

    1.SpringMVC在项目中的应用? 1)service层,项目的业务逻辑层,一般先定义一个接口,在写一个实现类,实现所有的接口方法.service的实现类中要加注解@Service(用于标注业务层 ...

  6. 【poj2114】点分治(离线)

    boatherds 2s 64M by czy 求一颗树上距离为K的点对是否存在 输入数据 n,m 接下来n-1条边a,b,c描述a到b有一条长度为c的路径 接下来m行每行询问一个K 输出数据 对于每 ...

  7. 【bzoj3362-导航难题】带权并查集

    题意: 约翰所在的乡村可以看做一个二维平面,其中有N 座牧场,每座牧场都有自己的坐标,编号为1到N.牧场间存在一些道路,每条道路道路连接两个不同的牧场,方向必定平行于X 轴或Y轴.连通两座牧场之间的路 ...

  8. bzoj3043 IncDec Sequence

    传送门:http://www.lydsy.com/JudgeOnline/problem.php?id=3043 [题解] 比较神奇的一道题,开始没往差分的角度上想,所以没想出来. 考虑查分数组,有$ ...

  9. 使用yo -v查看yeoman版本号

    使用yo -v无法查看yeoman版本,这是旧版本的方法 新版本使用yo --version即可查看

  10. arch中pacman的使用

    Pacman 是archlinux 下的包管理软件.它将一个简单的二进制包格式和易用的构建系统结合了起来.不管软件包是来自官方的 Arch 库还是用户自己创建,Pacman 都能方便得管理. pacm ...