当前位置: 首页 > 编程日记 > 正文

BZOJ 3573 米特运输

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)。

Output

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

Sample Input



5
5
4
3
2
I
12
13
24
25


Sample Output

3

HINT



【样例解释】

  一个最优解是将A[1]改成8,A[3]改成4,A[5]改成2。这样,2和3运给1的量相等,4和5运

给2的量相等,且每天晚上六点的时候,1,2满,3,4,5空,满足所有限制条件。


对于100%的数据满足N<500000,A[j]<10^8

Source

别人都说读懂了题目是到水题,但是我做并没有想象中那么水啊,我还是翻了题解的。。。QAQ,一定是我太弱了。。。

其实做法还是很好理解的。任意两个点的倍率关系是确定的(若a是b的孩子,b又有k个孩子,则A[b]=k*A[a],利用这个关系可以推出任意两个点的关系。做的时候脑袋蠢了,没有想到这一点)。设dis[i]为修改后A[1]=dis[i]*A[i],那么依题意当a不修改时b不修改当且仅当A[a]*dis[a]=A[b]*dis[b],因此我们就可以反过来想。求最少修改的不就是求最多的不修改的吗???我们知道所有的A[i]*dis[i],看哪一个值最多就可以了。

但是dis数组值有可能会很大,我们有两种应对的策略——(取对数再sort(取对数是个很重要的处理方法),哈希)。

 1 #include<algorithm>
 2 #include<cmath>
 3 #include<vector>
 4 #include<iostream>
 5 #include<cstdio>
 6 #include<cstdlib>
 7 using namespace std;
 8 
 9 typedef long double ld;
10 #define maxn (500010)
11 #define inf (1 << 30)
12 #define eps (1e-11)
13 int n,next[maxn<<1],toit[maxn<<1],fa[maxn];
14 int side[maxn],cnt,team[maxn],d[maxn];
15 ld A[maxn],dis[maxn],bac[maxn]; bool in[maxn];
16 
17 inline bool equal(ld a,ld b) { return fabs(a-b) <= eps; }
18 
19 inline void add(int a,int b) { next[++cnt] = side[a]; side[a] = cnt; toit[cnt] = b; }
20 
21 inline void ins(int a,int b) { add(a,b); add(b,a); }
22 
23 inline void bfs()
24 {
25     int h = 0,t = 0;
26     in[1] = true; team[++t] = 1;
27     while (h != t)
28     {
29         int now = team[++h];
30         for (int i = side[now];i;i = next[i])
31             if (!in[toit[i]])
32                 in[toit[i]] = true,team[++t] = toit[i],fa[toit[i]] = now,++d[now];
33     }
34     for (int i = 2;i <= n;++i)
35         dis[team[i]] = dis[fa[team[i]]] + log(d[fa[team[i]]]);
36 }
37 
38 inline void work()
39 {
40     int res = 1,cnt; ld last = -1;
41     for (int i = 1;i <= n;++i) bac[i] = dis[i] + A[i];
42     sort(bac+1,bac+n+1);
43     for (int i = 1;i <= n;++i)
44     {
45         if (equal(bac[i],last)) res = max(res,++cnt);
46         else last = bac[i],cnt = 1;
47     }
48     printf("%d",n-res);
49 }
50 
51 int main()
52 {
53     freopen("3573.in","r",stdin);
54     freopen("3573.out","w",stdout);
55     int a,b; scanf("%d",&n);
56     for (int i = 1;i <= n;++i) scanf("%d",&a),A[i] = log(a);
57     for (int i = 1;i < n;++i) scanf("%d %d",&a,&b),ins(a,b);
58     bfs(); work();
59     fclose(stdin); fclose(stdout);
60     return 0;
61 }
View Code

转载于:https://www.cnblogs.com/mmlz/p/4297671.html

相关文章:

[学习笔记]最小割之最小点权覆盖最大点权独立集

最小点权覆盖 给出一个二分图&#xff0c;每个点有一个非负点权要求选出一些点构成一个覆盖&#xff0c;问点权最小是多少 建模&#xff1a; S到左部点&#xff0c;容量为点权 右部点到T&#xff0c;容量为点权 左部点到右部点的边&#xff0c;容量inf 求最小割即可。 证明&…

10分钟学会Google Map API

http://space.itpub.net/14734354/viewspace-374828 前几天玩了玩Google的Map API&#xff0c;感觉还不错&#xff0c;很简单。但凡有过任何编程经验的同学&#xff0c;看完以下的教程&#xff0c;都可以在10分钟内掌握它的主要功能。另外我还做了个简单的小例子&#xff0c;有…

1143 Lowest Common Ancestor(建树与不建两种思路)

目录 解法一 解法二 解法一 这题可以不建树&#xff0c;直接利用BST的性质&#xff1a;左子树<根节点<右子树&#xff0c;对先序序列进行遍历&#xff0c;如果有某个元素大于等于u,v中较小的且小于等于u,v中较大的&#xff0c;则可能是根节点。 这题数据弱&#xff0…

UIScrollView

UIScrollView&#xff08;包括它的子类 UITableView 和 UICollectionView&#xff09;是 iOS 开发中最常用也是最有意思的 UI 组件&#xff0c;大部分 App 的核心界面都是基于三者之一或三者的组合实现。UIScrollView 是 UIKit 中为数不多能响应滑动手势的 view&#xff0c;相比…

MySQL练习题:常用函数

1. 以首字母大写&#xff0c;其他字母小写的方式显示所有员工的姓名2. 将员工的职位用小写字母显示3. 显示员工姓名超过5个字符的员工名4. 用#来填充员工职位job的结尾处&#xff0c;按10个字符长度输出。5. 去除字符串 hello world 两边的空格&#xff0c;并将单词间的空格改…

我的WINCE4.2历程(10)

2010-04-02 今天的主要工作&#xff1a; 1&#xff09;RTC4513驱动调试&#xff0c;又做了一些尝试&#xff08;检查GPIO口的第二功能设置是否正常&#xff09;&#xff0c;结果还是不正常&#xff0c;FAINT。 2&#xff09;回顾了截止到目前取得的进展&#xff1a; a&#xff…

1069 The Black Hole of Numbers

注意两点&#xff1a; 1. 不足4位要补足&#xff0c;不仅仅是一开始要考虑&#xff0c;每次得到一个差值&#xff0c;都要考虑 2. 到0也会停下&#xff0c;不仅仅是一开始可能发生&#xff0c;也可能是过程中的某一个差值 另&#xff1a; vector<int> 是可以作为函数…

详解Asp.net MVC DropDownLists

来自网络&#xff1a; Asp.net MVC中的DropDownLists貌似会让一开始从Asp.net Forms转过来的程序员造成不少迷惑.这篇文章讲述了为了使用DropDownLists,你需要在Asp.Net MVC中知道的方方面面. DropDownList,ComboBox,无论你喜欢怎么称呼这些&#xff0c;他们毫无例外的会被生成…

3D中的OBJ文件格式详解(转载)

OBJ文件是Alias|Wavefront公司为它的一套基于工作站的3D建模和动画软件"Advanced Visualizer"开发的一种标准3D模型文件格式&#xff0c;很适合用于3D软件模型之间的互导&#xff0c;也可以通过Maya读写。比如你在3dsMax或LightWave中建了一个模型&#xff0c;想把它…

比特币测试网络搭建

转自 https://blog.csdn.net/yzpbright/article/details/81004202 比特币 一、安装 Docker 二、安装和运行比特币测试网络(bitcoin-testnet) 1.下载比特币测试网络(bitcoin-testnet)的Docker镜像 docker pull freewil/bitcoin-testnet-box 2.运行Docker镜像 docker run -t -i -…

1136 A Delayed Palindrome 需再做

注意点&#xff1a; 1. 大整数即高精度整数&#xff0c;数据结构bign要会定义 2. 记得写构造函数或者通过别的方式初始化bign 3. len属性记得手动更新 4. int d[maxn]数组是顺位存储&#xff0c;意味着字符串要逆序读入 AC代码 #include<cstdio> #include<iostr…

ES5-Array-push(),pop(),shift(),unshift()

参考文章&#xff1a;push()&#xff0c;pop() push方法用于在数组的末端添加一个或多个元素&#xff0c;并返回添加新元素后的数组长度。 注意&#xff0c;该方法会改变原数组&#xff0c;而不是创建一个新的数组。var arr [];arr.push(1) // 1 arr.push(a) // 2 arr.push(tr…

visual studio 2005 新建C++空项目无法调试的解决方案

(1)项目属性→配置属性→链接器从→调试→生成调试信息→将“否”改为“是(/DEBUG)”。(2)项目属性→配置属性→C/C→调试信息格式→将“禁用”改为“用于编辑并继续的程序数据库(/ZI)”。(3)项目属性→配置属性→C/C→优化→优化→将“最大化速度(/O2)”改为“禁用(/Od)”。转…

jQuery.append()、jQuery.html()存在的XSS漏洞

使用jQuery.append()、jQuery.html()方法时&#xff0c;如果其中内容包含<script>脚本而没有经过任何处理的话&#xff0c;会执行它。 简单的示例代码如下&#xff1a; 1 var xssStr <script>console.log(1)</script>; 2 $(#test).html(xssStr); 控制台会打…

1132 Cut Integer

注意&#xff1a;取余得到的后半段b可能为0&#xff0c;所以要预先判断&#xff0c;否则会出现浮点错误。 写成 if(b!0&&z%(a*b)0)是不能避免浮点错误的&#xff0c;因为z%(a*b)已经发生。需要更换两个条件的位置&#xff0c;把前提放在前面&#xff0c;即 if(b!0&am…

.net之工作流工程展示及代码分享(二)工作流引擎

在介绍完表单类的时候&#xff0c;接下来介绍工作流引擎&#xff0c;主要由四个类组成&#xff0c;分别是流程、流程步骤、流程实例、流程步骤实例类。 流程类&#xff1a; 1 [Serializable]2 public class Flow3 {4 [XmlAttribute]5 public Guid …

11.CCNA第十一天-配置OSPF/EIGRP(增强型内部网关协议)

配置OSPFBranch(config)#router ospf ?<1-65535> Process ID通配符掩码在IGP协议中&#xff0c;以连续的0和连续的1组成有一种不科学的称呼&#xff08;反掩码&#xff09;Branch#show running-config | section router ospfrouter ospf 10network 10.1.0.0 0.0.255.25…

Electio Time poj

第一次用结构体&#xff0c;写些自己的心得&#xff1a; #include<stdio.h> #include<algorithm> using namespace std; #define MAX 50000 struct COW //定义结构体&#xff0c;&#xff08;由于在cmp&#xff08;&#xff09;函数里需要用到结构体名&#xf…

浙江大学软件学院2020年保研上机模拟练习 7-3 Partial School Ranking

并查集的使用时注意&#xff1a; 1. 合并两个结点是 F[sa] sb 而不是 sb F[sa]&#xff0c;想一下含义。 2. 给每个结点赋予其自身为父节点时&#xff0c;要先判断它的父节点是不是0&#xff0c;也许已经有了。 我把照片里其他同学的成绩赋值为0&#xff0c;但是应该考虑到…

小米:开源不仅要站在巨人的肩膀上,还要为巨人指方向

今天上午&#xff0c;第一届小米开源技术峰会在北京举行&#xff0c;会上&#xff0c;小米人工智能与云平台副总裁崔宝秋致开场词&#xff0c;并发表了《小米开源之路》的演讲。 崔宝秋强调小米一直在推动开源&#xff0c;也是开源的倡导者。他告诉我们雷军创立小米的其中一个重…

微软企业库4.1学习笔记(七)创建对象 续集1

3.2使用Unity模块创建企业库对象 下面介绍如何使用前面的方法获取企业库对象的实例。代码示例如下 IUnityContainer containter newUnityContainer(); containter.AddNewExtension<EnterpriseLibraryCoreExtension>();首先创建一个Unity容器&#xff0c;并且添…

如何把 XML 文件显示为 HTML 表格

如何把 XML 文件显示为 HTML 表格 <html><head><script type"text/javascript">var xmlhttp; function loadXMLDoc(url){xmlhttpnull;if (window.XMLHttpRequest) {// code for IE7, Firefox, Mozilla, etc. xmlhttpnew XMLHttpRequest(); }else i…

浙江大学软件学院2020年保研上机模拟练习 7-2 Distance of Triples

思路一&#xff1a; 3个数组都按照小到大排序&#xff0c;设置3个指针&#xff0c;起始都在数组的末尾&#xff0c;如果1个指针向前移动1位可以让对应元素和另两个数组元素的距离之和减小&#xff0c;则移动它。如果某一回合三个指针都没动&#xff0c;就跳出循环。 非满分&a…

docker的分层

docker的分层 Contents docker的层docker的层是怎么来的docker是如何区分这些层 docker镜像是如何区分这些层的docker的层在本地的存储 vfsdevicemapperdocker的层 在这里&#xff0c;我们首先做一个样例&#xff0c;样例设定为一个镜像D。当然&#xff0c;这个D镜像不是单层&a…

《跟菜鸟学Cisco UC部署实战》-第 1 章 规划-课件(一共12章,免费)

链接:https://pan.baidu.com/s/1RiIphSUG5dsbPPqWaynHjQ 提取码:xjp9 复制这段内容后打开百度网盘手机App,操作更方便哦 《跟菜鸟学Cisco UC部署实战》-视频课程http://edu.51cto.com/course/10031.html 《Skype for Business Server 2015-企业外部-部署》视频课程http://ed…

UpdateDate()函数的作用

UpdateData(true); 用窗体上控件中的内容来更新和控件相关连的变量的值&#xff08;只能更新value类型的变量&#xff09; 例如&#xff1a;你在你的窗体中有一个Edit控件&#xff0c;为这个控件关联了CString类型的变量m_strName; 你在控件中添入内容之后&#xf…

1021 Deepest Root

要解决两大问题&#xff1a; 1. 数包含几个连通分量 2. 如何找到最深结点 注意&#xff1a;connected components的意思是连通分量 问题1我用并查集解决 问题2转化为如何得到每个结点的深度 值得注意之处是对于问题2来说&#xff0c;下图是测试用例1给出的树 可以看出从1…

一段处理百分数的js代码

function percent(s, e, i){s Number(s), isNaN(s) && (s "0");var n "%";return e !1 && (n ""), parseFloat((100 * s).toFixed(i)) n } s 需要处理的数字 e 是否显示百分号(%) true 或 false i 保留几位小数 转载于:h…

js字符串如何倒序

1. var reverse function( str ){ var newStr , i str.length; for(; i > 0; i--) { newStr str.charAt(i); } return newStr; };reverse(abcde) 2. var reverse function( str ){ return str.split().reverse().join(); }; 3.&#xff08;类似法2&#xff09; var rev…

Windows Phone 7 Tip (4) -- User Agent

The user agent for IE on Windows Phone 7 running on the Asus Galaxy device is:Mozilla/4.0 (compatible; MSIE 7.0; Windows Phone OS 7.0; Trident/3.1; IEMobile/7.0) Asus;Galaxy6 source转载于:https://www.cnblogs.com/midshipman/archive/2010/04/29/1723416.html