【链接】http://hihocoder.com/problemset/problem/1564


【题意】


在这里写题意

【题解】


如下图

(上图中节点旁边的红色数字为它的权值)
从叶子节点开始考虑。
看到2的两个叶子节点3和4,它们的权值分别为3和5,那么我们就一定要把叶子节点3的权值变成5才行.
不然,我们是无法满足1到3的这条路径1到4的这条路径一样的。
因为如果不在3号节点这个位置上加权值,而在其他的节点加权值,那么这两条路径的总权值会同时增加.(或者同时不增加);因为除了这个点之外,其他的点肯定是它们都没有经过,或者都经过了的。
(6,7和9,10这两对叶子节点做相同的操作即可)
然后,我们把最低层的叶子节点的最大权值往上传递.分别传递了5,9,13这3个权值到它们各自的父亲节点2,5,8

然后就能得到2号节点到叶子节点的路径的权值都是8,而5号节点各个到叶子节点的路径都是11,而8号节点各个到叶子节点的路径都是17
还是一样,我们想让这些路径的权值和都变成一样的话.
就得把2,5这2个点的权值都分别加上一些值,让他们到各自叶子节点的路径的权值和都是17(最小的);
根据上面的论述,可以肯定只能是在2,5,8这几个点改权值.
然后再把17往上传。。。
这样做的正确性是可以肯定的,因为我们每次往上传递的,只是该节点的各个儿子到叶子节点的路径的最长的长度.
所以最后肯定是有这么一条路径的.又不能减小,则只能变成这个路径咯
然后我们每次加的时候,又都是按照最小的原则,且是唯一的原则,所以肯定是对的。


【错的次数】


0

【反思】


多画几张图,就能发现每次增加的点和量都是固定的这个规律的。

【代码】

#include <cstdio>
#include <iostream>
#include <algorithm>
#include <cstring>
#include <vector>
#include <map>
#include <queue>
#include <iomanip>
#include <set>
#include <cstdlib>
#include <cmath>
using namespace std;
#define lson l,m,rt<<1
#define rson m+1,r,rt<<1|1
#define LL long long
#define rep1(i,a,b) for (int i = a;i <= b;i++)
#define rep2(i,a,b) for (int i = a;i >= b;i--)
#define mp make_pair
#define pb emplace_back
#define fi first
#define se second
#define ld long double
#define ms(x,y) memset(x,y,sizeof x)
#define ri(x) scanf("%d",&x)
#define rl(x) scanf("%lld",&x)
#define rs(x) scanf("%s",x)
#define rf(x) scnaf("%lf",&x)
#define oi(x) printf("%d",x)
#define ol(x) printf("%lld",x)
#define oc putchar(' ')
#define os(x) printf(x)
#define all(x) x.begin(),x.end()
#define Open() freopen("F:\\rush.txt","r",stdin)
#define Close() ios::sync_with_stdio(0)
#define sz(x) ((int) x.size())
#define ld long double typedef pair<int, int> pii;
typedef pair<LL, LL> pll; //mt19937 myrand(time(0));
//int get_rand(int n){return myrand()%n + 1;}
const int dx[9] = { 0,1,-1,0,0,-1,-1,1,1 };
const int dy[9] = { 0,0,0,-1,1,-1,1,-1,1 };
const double pi = acos(-1.0);
const int N = 1e5; int n, a[N + 10],fa[N+10];
vector <int> g[N + 10];
LL sum[N + 10],f[N+10],ans; void dfs(int x) {
int len = sz(g[x]);
rep1(i, 0, len - 1) {
int y = g[x][i];
dfs(y);
f[x] = max(f[x], f[y]);
}
rep1(i, 0, len - 1) {
int y = g[x][i];
ans += f[x] - f[y];
}
f[x] += a[x];
} int main() {
//Open();
//Close();
ri(n);
rep1(i, 1, n) ri(a[i]);
rep1(i, 1, n-1) {
int a, b;
ri(a), ri(b);
fa[b] = a;
g[a].pb(b);
}
int root = 1;
rep1(i, 1, n)
if (fa[i] == 0)
root = i;
dfs(root);
ol(ans); puts("");
return 0;
}

【hihocoder 1564】同步H公司的终端的更多相关文章

  1. hihocoder 1347 小h的树上的朋友

    传送门 时间限制:18000ms单点时限:2000ms内存限制:512MB 描述 小h拥有$n$位朋友.每位朋友拥有一个数值$V_i$代表他与小h的亲密度.亲密度有可能发生变化.岁月流逝,小h的朋友们 ...

  2. hiho 1564 - 简单dfs + 宏的危害!!!

    题目链接 H公司有 N 台服务器,编号1~N,组成了一个树形结构.其中中央服务器处于根节点,终端服务器处于叶子节点. 中央服务器会向终端服务器发送消息.一条消息会通过中间节点,到达所有的终端服务器.消 ...

  3. (转)SqlServer 数据库同步的两种方式 (发布、订阅),主从数据库之间的同步

    最近在琢磨主从数据库之间的同步,公司正好也需要,在园子里找了一下,看到这篇博文比较详细,比较简单,本人亲自按步骤来过,现在分享给大家. 在这里要提醒大家的是(为了更好的理解,以下是本人自己理解,如有错 ...

  4. 跨终端 Web

    跨终端 Web(移动优先|响应式|HTML5|Hybrid|桌面+移动应用|一线前端负责人联袂推荐) 徐凯  著   ISBN 978-7-121-23345-6 2014年6月出版 定价:55.00 ...

  5. 转: 跨终端Web之Hybrid App

    转:  http://www.infoq.com/cn/articles/hybrid-app 编者按:InfoQ开设新栏目“品味书香”,精选技术书籍的精彩章节,以及分享看完书留下的思考和收获,欢迎大 ...

  6. 多站点FTP同步

    需求描述: 由于工作的原因,发布程序时,经常需要将一站点的脚本.程序同步到其它的终端站点中,以保证所有站点的程序是同步的,用过FlashFtp,CuteFtp,LeapFtp等客户端工具,均于自己的需 ...

  7. 跨终端Web之Hybrid App

    Native App(以下简称Native)和Mobile Web(以下简称Web)二者混合开发的产物被称为Hybrid App(以下简称Hybrid).Hybrid并不是什么新概念,最早可以追溯到S ...

  8. 单纯觉得是篇好文——跨终端Web之Hybrid App

    [reference]http://www.infoq.com/cn/articles/hybrid-app#theCommentsSection 编者按:InfoQ开设新栏目“品味书香”,精选技术书 ...

  9. Rocketlab公司火箭Electron介绍

    http://https://en.wikipedia.org/wiki/Rocket_Lab https://www.rocketlabusa.com/ Rocketlab(火箭实验室)是一家致力于 ...

随机推荐

  1. Ubuntu16.04 “有线未托管”有线网络不可用问题解决

    Ubuntu16.04 “有线未托管”问题解决 电脑上安装的Ubuntu16.04 是通过先安装Ubuntu Server后在通过命令 sudo tasksel 安装的Gnome桌面环境,安装完成后发 ...

  2. 使用scatter画散点图

    刚开始接触Python,照着例子写的代码,百度注释的. from numpy import * import matplotlib import matplotlib.pyplot as plt im ...

  3. Eclipse中JDK的配置

    window -> preference -> java -> install jres -> add -> standard vm -> 设置好相应的jre ho ...

  4. unity 获取物体尺寸

     unity3d中获得物体的size 以size的x方向为例 1:gameObject.renderer.bounds.size.x;//这个值的结果真实反应出有MeshRenderer这个组件的 ...

  5. Android引入library失败的可能原因

    eclipse环境,引入library一直失败 谷歌到的原因是 Windows下 目标工程必须和引用工程在同一磁盘盘符下 然后我将要引入的library项目移动和现在项目同一磁盘下,引入成功 至于为什 ...

  6. ElasticSearch 架构图

    ElasticSearch 架构图 从下往上来分析ElasticSearch 架构图 Gateway代表ElasticSearch索引的持久化存储方式. 在Gateway中,ElasticSearch ...

  7. Day1上午解题报告

    预计分数:100+60+0=160 实际分数:100+30+20=150 T1立方数(cubic) 题目描述 LYK定义了一个数叫“立方数”,若一个数可以被写作是一个正整数的3次方,则这个数就是立方数 ...

  8. 洛谷——P2590 [ZJOI2008]树的统计

    https://www.luogu.org/problem/show?pid=2590#sub 题目描述 一棵树上有n个节点,编号分别为1到n,每个节点都有一个权值w. 我们将以下面的形式来要求你对这 ...

  9. [React] Use a Render Porp

    More detail check LInk. Render Prop vs HOC: HOC version for withMouse: import React from 'react' imp ...

  10. 多线程编程(二)--进程&amp;&amp;线程

    看完上篇博文的介绍后,大家应该大概了解进程和线程的由来.有了这样一个背景我们进一步来看一下线程和进程. 引入进程: 进程能够提高系统的并发性.提高CPU的使用率,从而提高程序的性能.在曾经单道操作系统 ...