Description

米特是D星球上一种非常神秘的物质,蕴含着巨大的能量。在以米特为主要能源的D星上,这种米特能源的运输和储
存一直是一个大问题。D星上有N个城市,我们将其顺序编号为1到N,1号城市为首都。这N个城市由N-1条单向高速
通道连接起来,构成一棵以1号城市(首部)为根的树,高速通道的方向由树中的儿子指向父亲。树按深度分层:
根结点深度为0,属于第1层;根结点的子节点深度为1,属于第2层;依此类推,深度为i的结点属于第i+l层。建好
高速通道之后,D星人开始考虑如何具体地储存和传输米特资源。由于发展程度不同,每个城市储存米特的能力不
尽相同,其中第i个城市建有一个容量为A[i]的米特储存器。这个米特储存器除了具有储存的功能,还具有自动收
集米特的能力。如果到了晚上六点,有某个储存器处于未满的状态,它就会自动收集大气中蕴含的米特能源,在早
上六点之前就能收集满;但是,只有在储存器完全空的状态下启动自动收集程序才是安全的,未满而又非空时启动
可能有安全隐患。早上六点到七点间,根节点城市(1号城市)会将其储存器里的米特消耗殆尽。根节点不会自动
搜集米特,它只接受子节点传输来的米特。早上七点,城市之间启动米特传输过程,传输过程逐层递进:先是第2
层节点城市向第1层(根节点城市,即1号城市)传输,直到第1层的储存器满或第2层的储存器全为空;然后是第3
层向第2层传输,直到对于第2层的每个节点,其储存器满或其予节点(位于第3层)的储存器全为空;依此类推,
直到最后一层传输完成。传输过程一定会在晚上六点前完成。
由于技术原因,运输方案需要满足以下条件:
(1)不能让某个储存器到了晚上六点传输结束时还处于非空但又未满的状态,这个时候储存器仍然会启动自动收集
米特的程序,而给已经储存有米特的储存器启动收集程序可能导致危险,也就是说要让储存器到了晚上六点时要么
空要么满;
(2)关于首都——即1号城市的特殊情况,  每天早上六点到七点间1号城市中的米特储存器里的米特会自动被消耗
殆尽,即运输方案不需要考虑首都的米特怎么运走;
(3)除了1号城市,每个节点必须在其子节点城市向它运输米特之前将这座城市的米特储存器中原本存有的米特全部
运出去给父节点,不允许储存器中残存的米特与外来的米特发生混合;
(4)运向某一个城市的若干个来源的米特数量必须完全相同,不然,这些来源不同的米特按不同比例混合之后可能
发生危险。
现在D星人已经建立好高速通道,每个城市也有了一定储存容量的米特储存器。为了满足上面的限制条件,可能需
要重建一些城市中的米特储存器。你可以,也只能,将某一座城市(包括首都)中原来存在的米特储存器摧毁,再
新建一座任意容量的新的米特储存器,其容量可以是小数(在输入数据中,储存器原始容量是正整数,但重建后可
以是小数),不能是负数或零,使得需要被重建的米特储存器的数目尽量少。

Input

第一行是一个正整数N,表示城市的数目。
接下来N行,每行一个正整数,其中的第i行表示第i个城市原来存在的米特储存器的容量。
再接下来是N-I行,每行两个正整数a,b表示城市b到城市a有一条高速通道(a≠b)。
N<500000,A[j]<10^8

Output

输出文件仅包含一行,一个整数,表示最少的被重建(即修改储存器容量)的米特储存器的数目。

Sample Input

5
5
4
3
2
1
1 2
1 3
2 4
2 5

Sample Output

3
【样例解释】
一个最优解是将A[1]改成8,A[3]改成4,A[5]改成2。
这样,2和3运给1的量相等,4和5运给2的量相等,且每天晚上六点的时候,1,2满,3,4,5空,满足所有限制条件。

Solution

题意:给你一颗树,要让每个点的儿子权值相同,且让每个点的权值等于儿子权值之和。问最少改变多少个点的权值。
应该算是一个树形DP吧,题面长度感人。
首先可以发现,如果一个点的权值被确定了,那么整棵树的权值都被确定了。因为点和相邻点的权值是相关的。
计算出每个节点权值不变时根节点的权值,记为$f$数组。显然若$f[x]=f[y]$,那么$x$点和$y$点就是可以一起不被改变的。
找出可以一起不被改变的最大个数,最后用$n$减去个数即为答案。
计算根节点的权值的时候权值会非常大,所以取个log把乘法转化成加法就好了。

Code

 1 #include<iostream>
 2 #include<cstdio>
 3 #include<cmath>
 4 #include<algorithm>
 5 #define N (500009)
 6 using namespace std;
 7
 8 struct Edge{int to,next;}edge[N<<1];
 9 int n,u,v,cnt,ans=1,Ind[N],a[N];
10 int head[N],num_edge;
11 double f[N];
12
13 void add(int u,int v)
14 {
15     edge[++num_edge].to=v;
16     edge[num_edge].next=head[u];
17     head[u]=num_edge;
18 }
19
20 void Dfs(int x,int fa)
21 {
22     for (int i=head[x]; i; i=edge[i].next)
23         if (edge[i].to!=fa)
24             f[edge[i].to]=f[x]+log(1.0*Ind[x]), Dfs(edge[i].to,x);
25 }
26
27 int main()
28 {
29     scanf("%d",&n);
30     for (int i=1; i<=n; ++i)
31         scanf("%d",&a[i]);
32     for (int i=1; i<=n-1; ++i)
33     {
34         scanf("%d%d",&u,&v);
35         add(u,v); add(v,u); ++Ind[u]; ++Ind[v];
36     }
37     for (int i=2; i<=n; ++i) --Ind[i];
38     Dfs(1,0);
39     for (int i=1; i<=n; ++i) f[i]+=log(1.0*a[i]);
40
41     sort(f+1,f+n+1);
42     for (int i=1; i<=n; ++i)
43         if (f[i]-f[i-1]>1e-8) cnt=1;
44         else ++cnt,ans=max(ans,cnt);
45     printf("%d\n",n-ans);
46 }

转载于:https://www.cnblogs.com/refun/p/9697755.html

BZOJ3573:[HNOI2014]米特运输(树形DP)相关推荐

  1. BZOJ3573: [Hnoi2014]米特运输(树上乱搞)

    Time Limit: 20 Sec  Memory Limit: 128 MB Submit: 1669  Solved: 1031 [Submit][Status][Discuss] Descri ...

  2. 洛谷P3237 [HNOI2014]米特运输 题解

    洛谷P3237 [HNOI2014]米特运输 题解 题目链接:P3237 [HNOI2014]米特运输 题意: 这题面是真的长啊 qwq 米特是D星球上一种非常神秘的物质,蕴含着巨大的能量.在以米特为 ...

  3. P3237 [HNOI2014]米特运输

    P3237 [HNOI2014]米特运输 第104道题让我洛谷红名. (^ w ^) 题目描述 米特是D星球上一种非常神秘的物质,蕴含着巨大的能量.在以米特为主要能源的D星上,这种米特能源的运输和储存 ...

  4. BZOJ 3573 [HNOI2014]米特运输

    题目链接:传送门 冗长冗长的题面: 3573:[HNOI2014]米特运输3573: [HNOI2014]米特运输3573:[HNOI2014]米特运输 Description 米特是D星球上一种非常 ...

  5. 【bzoj3573】[Hnoi2014]米特运输

    题目链接 Description 米特是D星球上一种非常神秘的物质,蕴含着巨大的能量.在以米特为主要能源的D星上,这种米特能源的运输和储存一直是一个大问题. D星上有N个城市,我们将其顺序编号为1到N ...

  6. [HNOI2014]米特运输

    Description 米特是D星球上一种非常神秘的物质,蕴含着巨大的能量.在以米特为主要能源的D星上,这种米特能源的运输和储存一直是一个大问题.D星上有N个城市,我们将其顺序编号为1到N,1号城市为 ...

  7. 洛谷P3237 [HNOI2014]米特运输

    题目描述 米特是D星球上一种非常神秘的物质,蕴含着巨大的能量.在以米特为主要能源的D星上,这种米特能源的运输和储存一直是一个大问题. D星上有N个城市,我们将其顺序编号为1到N,1号城市为首都.这N个 ...

  8. hnoi2014米特运输

    思维题  略水 我们一定要用以偏概全的眼光做这道题... 一根节点说明一切 #include <cstdio> #include <cstring> #include < ...

  9. bzoj3573米特运输

    题意: 给定一棵树上的边和点权 改动点权使得每个父节点u容量为子节点容量的d[u](子节点个数)倍 考察点: 1.这是一道语文题 2.点权很大 直接算会爆 有一种优化办法:取log(醉 这是什么优化) ...

最新文章

  1. PS2019画笔工具、铅笔工具、颜色替换工具
  2. 静态html页面传递参数,javascript静态页面传值的三种方法分享
  3. spark从hbase读数据到存入hbase数据两种版本写法
  4. Notepad++ 设置执行 lua 和 python
  5. python24点4张扑克_Python实现扑克24点小游戏 ,从此我就没输过
  6. [PyTorch] 官网教程之神经网络
  7. 第 4 章 Spring
  8. python爬虫-Python爬虫入门这一篇就够了
  9. php实现微信小程序人脸识别登录
  10. 看Spring实战有感(一)
  11. java keystore php,KeyStoreSpi
  12. 绘制奥林匹克五环旗。
  13. Webbrowser 使用IE 最高版本
  14. 李小龙私人的超级训练计划
  15. python matplotlib axes3d.get_test_data() 是什么意思?(获得测试数据)
  16. Transaction silently rolled back because it has been marked as rollback-only Spring事务嵌套问题
  17. 发现公布错误是新闻价值所在
  18. OpenERP 千位分隔符(thousand separator)
  19. html表白earth,表白的英文句子
  20. 如何比较优雅地编码?

热门文章

  1. CentOS升级Python2到Python3
  2. 不要担心,我可以一个人走
  3. Jquery 常用方法经典总结
  4. 八个防止浪费时间的小窍门
  5. AngularJS转换请求内容
  6. 前端console log之坑。。。
  7. SQL 基础之索引、闪回、临时表(十八)
  8. HttpClient之GET请求
  9. [置顶]       设计模式之创建类模式——原型模式
  10. 重构了一波代码,聊聊后端也聊聊游戏后端