CF530D sum in the tree
很简单的一道贪心题
首先,先想想怎么判断是否合法
题目中说,a是自然数,那么子节点的s明显是不能比父节点大的,如果比父节点大,不合法!
所有深度为偶数的点的s被删除了,也只有深度为偶数的点被删除了,所以如果深度为奇数的点被删除了,或者有深度为偶数的点没有被删除,不合法!
所有不合法的情况我们已经判断完了,下面考虑如何使权值和最小
对于奇数层的点我们肯定是无法影响了,只有通过控制偶数层的点的权值才能影响总的权值和,而且只能影响自己和自己子节点的权值
我们从简单的入手,对于偶数层叶子结点,我们直接让它的\(s\)等于父节点的\(s\)即可,这样\(a\)为\(0\),合法且最优
对于有一个子节点的偶数层节点,取值在\([s_{fa},s_{son}]\)中任意取值,总的权值和都是不变的。
简单证明一下,就是\(a_{son}=s_{son}-s_v,a_{v}=s_v-s_{fa},a_v+a_{son}=s_{son}-s_{fa}\),而两个\(s\)都是已知的,所以这里的s爱取啥取啥,只要合法就行
那么对于子节点大于1的偶数层节点我们怎么处理呢,我们设子节点的权值不全相同
那么\(a_v=s_v-s_{fa},\sum a_{son}=\sum (s_{son}-s_v)\)
总的和就是\(\sum(s_{son}-s_v)+s_v-s_{fa}\)
显然,当\(s_v\)越小时,这个式子的值也就越小,同时我们还要保证合法,所以\(s_v\)我们就取最小的\(s_{son}\)
为了程序的简练,我们将三种情况合并,简述为
若存在子节点则为最小的\(s_{son}\),否则为\(s_{fa}\)
由于数据范围不小,记得开long long
就是这么简单,下面上代码,由于讲的已经很清楚了,代码就不加注释了
#include<algorithm>
#include<iostream>
#include<cstring>
#include<cstdio>
#include<cctype>
#ifdef ONLINE_JUDGE
#define puts(o) puts("I AK IOI\n")
#endif
#define ll long long
#define gc getchar
#define maxn 100005
using namespace std;
inline ll read(){
    ll a=0;int f=0;char p=gc();
    while(!isdigit(p)){f|=p=='-';p=gc();}
    while(isdigit(p)){a=(a<<3)+(a<<1)+(p^48);p=gc();}
    return f?-a:a;
}int n,ans;ll sum;
struct ahaha{
    int to,next;
}e[maxn];int tot,head[maxn];
inline void add(int u,int v){
    e[tot]={v,head[u]};head[u]=tot++;
}
int f[maxn],dep[maxn];ll s[maxn],s1[maxn];
void dfs(int u,int fa){
    for(int i=head[u];~i;i=e[i].next){
        int v=e[i].to;
        if(~s[v]){
            if((dep[v]&1)^1){ans=1;return;}
        }
        else{
            if(dep[v]&1){ans=1;return;}
            s[v]=(s1[v]==1000000001?s[u]:s1[v]);
        }
        if(s[v]<s[u]){ans=1;return;}
        sum+=s[v]-s[u];
        dfs(v,u);if(ans)return;
    }
}
ll dfs(int u){
    for(int i=head[u];~i;i=e[i].next){
        int v=e[i].to;
        dep[v]=dep[u]+1;
        s1[u]=min(s1[u],dfs(v));
    }
    return s[u];
}
int main(){memset(head,-1,sizeof head);
    n=read();dep[1]=1;
    for(int i=2;i<=n;++i)
        add(read(),i);
    for(int i=1;i<=n;++i){
        s[i]=read();
        s1[i]=1000000001;
    }
    sum+=s[1];dfs(1);dfs(1,-1);
    if(ans)
        puts("-1");
    else
        printf("%I64d\n",sum);
    return 0;
}
CF530D sum in the tree的更多相关文章
- 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号结 ... 
- CF-1099 D. Sum in the tree
		CF-1099 D. Sum in the tree 题意:结点序号为 1~n 的一个有根树,根序号为1,每个点有一个权值a[i], 然后定义一s[i]表示从根节点到 结点序号为i的结点的路途上所经过 ... 
- Codeforces Round #530 (Div. 2) D. Sum in the tree 树上贪心
		D. Sum in the tree 题意 给出一颗树,奇数层数的点有值,值代表从1到该点的简单路的权值的和,偶数层数的点权值被擦去了 问所有节点的和的最小可能是多少 思路 对于每一个-1(也就是值未 ... 
- 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 ... 
- codeforces #530 D(Sum in the tree) (树上贪心)
		Mitya has a rooted tree with nn vertices indexed from 11 to nn, where the root has index 11. Each ve ... 
- D. Sum in the tree(树形+贪心)
		题目链接;http://codeforces.com/contest/1099/problem/D 题目大意:给出一棵树,每个节点到根节点的路径上经过的所有点的权值之和,其深度为偶数的节点的信息全部擦 ... 
- Codeforces1099D.Sum in the tree(贪心)
		题目链接:传送门 思路: 一个节点放的数越大,那么以它为根的子树的节点权值之和就越小. 所以我们要在合法的范围内,使偶数层节点的权值尽可能地大.也就是说,令它的权值是子节点的最小值,这样保证了它的子节 ... 
- 【LeetCode OJ】Binary Tree Maximum Path Sum
		Problem Link: http://oj.leetcode.com/problems/binary-tree-maximum-path-sum/ For any path P in a bina ... 
- [LeetCode] Path Sum II 二叉树路径之和之二
		Given a binary tree and a sum, find all root-to-leaf paths where each path's sum equals the given su ... 
随机推荐
- weka使用笔记3---classfily API调用
			分类器在数据挖掘中的作用不言而喻,weka中的分类器有很多种类型,但是weka在输出结果中,只输出了一个分类的预测的类型,没有输出分类的得分,有一些不给力.如果想知道得分和其预测的类的话,就得调用we ... 
- js页面动态时间展示
			效果图: 具体代码 js代码 <script type="text/javascript"> var t = null; t = setTimeout(time,100 ... 
- L018-课前练习以及知识巩固笔记
			L018-课前练习以及知识巩固笔记 OK,今天课前做了几道题,算是对以往知识的巩固. 1.请描述下列路径的内容是做什么的?/etc/sysctl.conf/etc/rc.local/etc/hosts ... 
- Hibernate5使用注解方式(转)
			用Hibernate5使用映射文件时存在一个问题没有解决,在映射文件中配置了student_sequence,但找不到映射文件自增长的序列的sequence(Oracle)数据库. 输出的是 Hibe ... 
- node升级7.0以上版本使用gulp时报错
			今天使用gulp时 ,出现了以下报错信息: Error: Cannot find module 'internal/fs'at Object.<anonymous> (/home/XXX/ ... 
- Linux TCP/IP调优参数 /proc/sys/net/目录
			所有的TCP/IP调优参数都位于/proc/sys/net/目录. 例如, 下面是最重要的一些调优参数,后面是它们的含义: /proc/sys/net/core/rmem_default " ... 
- Angular7运行机制--根据腾讯课堂米斯特吴 《Angular4从入门到实战》学习笔记分析完成
- hive的简单使用
			一.一些说明 1.支持的操作 hive 默认不支持updata 和 delete操作 insert也是执行缓慢,主要用于数据的计算 hive 数据类型---字符串,大部分与java一致. 2.内外表的 ... 
- 搭建Git工作环境
			为什么要做版本控制? 在平时的工作中,经常会遇到写文档的事情,而写文档基本都不会一蹴而就,总是会修修改改很多次,而版本控制能够记录每次修改的版本,能够进行回溯.有很多版本控制工具,但是作为一个程序员, ... 
- 亮眼的购物季数据,高涨的 Amazon Prime
			依照往年的惯例,亚马逊公布了 2013 购物季的销售数据.据 The Verge 的报道,今年,仅仅网购星期一(Cyber Monday)一天就在全球范围内销售出 3680 万件商品,而去年这一数字为 ... 
