【AcWing周赛】 树中节点和

简介: 笔记

题目描述


2.png


输入格式


第一行包含一个整数 n。


第二行包含 n−1 个整数 p2,p3,…,pn,其中 pi 表示节点 i 的父节点编号。


第三行包含 n 个整数 s1,s2,…,sn,注意,由于所有 h 值为偶数的节点的 s 值都是未知的,所以这些节点的 s 值并未直接给出,而是用 −1 来代替。


输出格式


一个整数,表示 ∑ i = 1 n a i 的最小可能值。


如果不存在任何满足已知信息的合理赋值方案,则输出 −1。


数据范围


前 4 个测试点满足 2≤n≤5。

所有测试点满足 2≤n≤105,1≤pi


输入样例1:


5

1 1 1 1

1 -1 -1 -1 -1


输出样例1:


1


输入样例2:


5

1 2 3 1

1 -1 2 -1 -1


输出样例2:


2


输入样例3:


3

1 2

2 -1 1


输出样例3:


-1


思路

容易知道,从根节点向下会交替经过奇偶节点。


而对于奇节点有固定值,那么对于每个偶节点,其所有出点都是奇节点,会限制该偶节点的值,贪心的选择最小的出点值,并且在偶数层,确定完该偶数节点值后,出点的值也都一并确定了。


代码

#include <iostream>
#include <cstring>
#include <algorithm>
using namespace std;
#define int long long
const int N = 1000100, M = N << 1;
int dep[N];
int h[N], e[M], ne[M], idx;
int n;
int a[N], b[N];
bool flag = true;
void add(int a, int b)  // 添加一条边a->b
{
    e[idx] = b, ne[idx] = h[a], h[a] = idx ++ ;
}
void dfs(int u, int f, int now) {
    if(!flag) return ;
    dep[u] = dep[f] + 1;
    if(dep[u] % 2 == 0) {
        int r = 1e17;
        for (int i = h[u]; ~i; i = ne[i]) {
            int j = e[i];
            int x = a[j];
            if(j == f) continue;
            if(x < now) flag = false;
            r = min(r, x);
        }
        b[u] = r == 1e17 ? 0 : r - now;
        for (int i = h[u]; ~i; i = ne[i]) {
            int j = e[i];
            if(j == f) continue;
            b[j] = a[j] - b[u] - now;
        }
    }
    for (int i = h[u]; ~i; i = ne[i]) {
        int j = e[i];
        if(j == f) continue;
        dfs(j, u, now + b[u]);
    }
}
signed main()
{
    memset(h, -1, sizeof h);
    cin >> n;
    for (int i = 2; i <= n; i++) {
        int x; cin >> x;
        add(x, i);
        add(i, x);
    }
    for (int i = 1; i <= n; i++) cin >> a[i];
    b[1] = a[1];
    dfs(1, 0, 0);
    if(!flag) cout << -1 << endl;
    else {
        int ans = 0;
        for (int i = 1; i <= n; i++) ans += b[i];
        cout << ans << endl;
    }
    return 0;
}



相关文章
|
10月前
|
程序员 定位技术 开发者
试了试阿里云的通义灵码 2.5 版
通义灵码 2.5 版是个特别实用的工具,无论是个人开发者还是企业团队,都能从中受益。如果你也在找能提升开发效率的工具,通义灵码绝对值得一试!
407 33
试了试阿里云的通义灵码 2.5 版
|
JavaScript 前端开发 索引
Javascript知识【jQuery样式操作&案例:jQuery隔行换色】
Javascript知识【jQuery样式操作&案例:jQuery隔行换色】
|
11月前
|
机器学习/深度学习 人工智能 自然语言处理
全球人工智能产业迎来新机遇,这些就业方向别错过,生成式人工智能认证(GAI认证)助力
人工智能(AI)产业正迎来前所未有的发展机遇,技术革新如大模型、深度学习等推动产业变革,从医疗到教育各领域应用不断拓展。国际合作促进AI生态构建,GAI认证助力人才培养与职业发展。未来,随着技术进步与场景延伸,AI将为全球经济注入新活力,构建开放包容的产业生态,需把握机遇并应对挑战,共创美好前景。
|
JavaScript 前端开发 UED
事件处理(Event Handling):构建交互性Web应用的基石
在现代Web应用开发中,交互性是吸引用户的重要因素之一。而事件处理是实现这种交互性的关键。通过响应用户的操作,您可以创造出令人愉悦的用户体验。在本博客中,我们将深入探讨事件处理的概念、不同类型的事件、事件绑定、事件冒泡以及如何有效地使用事件处理来构建交互性强大的Web应用。
441 0
|
JavaScript 前端开发 算法
|
XML 缓存 Oracle
「微服务架构」API版本控制最佳实践介绍
「微服务架构」API版本控制最佳实践介绍
|
前端开发 IDE Java
Javaweb学习笔记(二)之发布动态资源
本文主要介绍了Javaweb项目实践案例,即发布动态资源和Servlet的简单介绍。
431 0
Javaweb学习笔记(二)之发布动态资源
|
机器学习/深度学习 索引
【Netty】NIO 缓冲区 ( Buffer ) ( 缓冲区读写类型 | 只读缓冲区 | 映射字节缓冲区 )(二)
【Netty】NIO 缓冲区 ( Buffer ) ( 缓冲区读写类型 | 只读缓冲区 | 映射字节缓冲区 )(二)
216 0
【Netty】NIO 缓冲区 ( Buffer ) ( 缓冲区读写类型 | 只读缓冲区 | 映射字节缓冲区 )(二)
|
存储 Java 开发者
HashMap 子类|学习笔记
快速学习 HashMap 子类
186 0
HashMap 子类|学习笔记

热门文章

最新文章