bzoj3829 POI2014 FAR-FarmCraft
思路
用\(f[i]\)表示完成第\(i\)棵子树所需要得时间。
考虑如果有两个子树\(a\)和\(b\),如果先去完成子树\(a\),那么对于花费得时间就是\(f[b] + siz[a] \times 2 + 1\)
所以如果有先遍历\(a\)更优秀的话。那么一定有\(f[b] + siz[a] \times 2 + 1 \le f[a] + siz[b] \times 2+ 1\)
即\(f[a] - siz[a] \times 2 \le f[b] - siz[b] \times 2\)
所以对于当前节点的每个子树按照上面的方法排个序。然后统计一下答案即可。
有个坑点就是必须最后完成\(1\)号节点,所以最后不能直接输出\(f[1]\),好在从样例里可以发现\(233\)
代码
/*
* @Author: wxyww
* @Date:   2019-02-13 07:26:04
* @Last Modified time: 2019-02-13 09:13:20
*/
#include<cstdio>
#include<iostream>
#include<cstdlib>
#include<cstring>
#include<algorithm>
#include<queue>
#include<vector>
#include<ctime>
using namespace std;
typedef long long ll;
const int N = 500000 + 100;
ll read() {
	ll x=0,f=1;char c=getchar();
	while(c<'0'||c>'9') {
		if(c=='-') f=-1;
		c=getchar();
	}
	while(c>='0'&&c<='9') {
		x=x*10+c-'0';
		c=getchar();
	}
	return x*f;
}
vector<int>e[N];
int f[N],siz[N];
int n,c[N];
bool cmp(int x,int y) {
	return f[x] - siz[x] * 2 > f[y] - siz[y] * 2;
}
void dfs(int u,int father) {
	int k = e[u].size();
	siz[u] = 1;
	int now = 0;
	if(c[u] != 1)
	f[u] = c[u];
	for(int i = 0;i < k;++i) {
		int v = e[u][i];
		if(v == father) continue;
		dfs(v,u);
		siz[u] += siz[v];
	}
	sort(e[u].begin(),e[u].end(),cmp);
	for(int i = 0;i < k;++i) {
		int v = e[u][i];
		if(v == father) continue;
		f[u] = max(f[u],now * 2 + f[v] + 1);
		now += siz[v];
	}
}
int main() {
	n = read();
	for(int i = 1;i <= n;++i) c[i] = read();
	for(int i = 1;i < n;++i) {
		int u = read(),v = read();
		e[u].push_back(v);e[v].push_back(u);
	}
	dfs(1,0);
	printf("%d\n",max(f[1],(n - 1) * 2 + c[1]));
	return 0;
}
												
											bzoj3829 POI2014 FAR-FarmCraft的更多相关文章
- BZOJ3829[Poi2014]FarmCraft——树形DP+贪心
		
题目描述 In a village called Byteville, there are houses connected with N-1 roads. For each pair of ho ...
 - BZOJ3829 [Poi2014]FarmCraft  【树形dp】
		
题目链接 BZOJ3829 题解 设\(f[i]\)为从\(i\)父亲进入\(i\)之前开始计时,\(i\)的子树中最晚装好的时间 同时记\(siz[i]\)为节点\(i\)子树大小的两倍,即为从父亲 ...
 - BZOJ3829 : [Poi2014]FarmCraft
		
d[x]表示走完x的子树并回到x所需的时间 f[x]表示从走到x开始计时,x子树中最晚的点安装完的最早时间 d[x]=sum(d[i]+2),i是x的孩子 f[x]的计算比较复杂: 考虑将x的各棵子树 ...
 - [BZOJ3829][Poi2014]FarmCraft 贪心
		
这个题应该是很容易想到贪心的,只要可是怎么贪才是科学的呢?我们分析一下题干,对于每个边只能一进一出因此,对于树上的一棵子树,我们只要一进子树就必须遍历完,因此我们只能进行一遍 dfs() 然后我们发现 ...
 - [bzoj3829][Poi2014]FarmCraft_树形dp
		
FarmCraft 题目链接:https://lydsy.com/JudgeOnline/problem.php?id=3829 数据范围:略. 题解: 因为每条边只能必须走两次,所以我们的路径一定是 ...
 - POI2014题解
		
POI2014题解 [BZOJ3521][Poi2014]Salad Bar 把p当作\(1\),把j当作\(-1\),然后做一遍前缀和. 一个合法区间\([l,r]\)要满足条件就需要满足所有前缀和 ...
 - POI2014
		
...一个shabi和一堆神题的故事 今天只写了两道 之后随缘更吧 啊 顺便 snake我是不会更的 bzoj3829 POI2014 Farmcraft mhy住在一棵有n个点的树的1号结点上,每个 ...
 - 【BZOJ3829】[Poi2014]FarmCraft 树形DP(贪心)
		
[BZOJ3829][Poi2014]FarmCraft Description In a village called Byteville, there are houses connected ...
 - 【bzoj3829】[Poi2014]FarmCraft  贪心
		
原文地址:http://www.cnblogs.com/GXZlegend/p/6826667.html 题目描述 In a village called Byteville, there are ...
 
随机推荐
- Eclipse中修改jsp、html……的编码格式
			
一般如果使用的是Eclipse的默认编码格式,在我们保存的时候会提示选择保存的编码格式,保存后英文没有问题,但是中文就会乱码. 修改方式是: Windows——>Preferences——> ...
 - 重启iis命令
			
iisreset
 - dart正则
			
1.前言 API中对于正则表达式的注释是:正则表达式的规范和语义与JavaScript相同详细的规范可以参考:http://ecma-international.org/ecma-262/5.1/#s ...
 - PS中如何把图片颜色加到字体上去
			
1.在PS中的图层中,将图片置于文字层的上方,同时按ctrl+alt+g键,这样就将文字范围以外的图像给剪切掉了.见附图下方的效果. 2.最终效果如下图: 参见:https://zhidao.baid ...
 - jenkins中通过execute shell启动的进程会被杀死的问题
			
在jenkins中配置自动更新部署项目时,如果采取用execute shell启动/关闭tomcat,会发现可以进行关闭tomcat, 但是无法启动tomcat,虽然构建会显示执行成功,但是查看进程, ...
 - 好用的UI框架收集
			
1. we-ui 专门为微信内网页和微信小程序设计的UI框架
 - python设计模式第八天【装饰器模式】
			
1.定义 使用包装的释放扩展类的功能,但是不使用继承 2.使用场景 3.代码实现 #!/usr/bin/env python #! _*_ coding:UTF-8 _*_ def MyDecorat ...
 - Python2基础
			
1.python 3.python函数 python的函数定义: 以def关键字定义一个函数: 参数放在小括号里面: 必须有return语句: 关键字参数: 即调用函数时传参顺序可以人为指定 默认参数 ...
 - Jenkins+PowerShell持续集成环境搭建(八)邮件通知
			
1. 默认邮件功能: Jenkins自带的邮件功能比较简单,配置如下: 设置默认发件人地址: 2. Email Extension Plugin 为了能够更加灵活地使用邮件功能,需要安装Email E ...
 - [洛谷日报第62期]Splay简易教程 (转载)
			
本文发布于洛谷日报,特约作者:tiger0132 原地址 分割线下为copy的内容 [洛谷日报第62期]Splay简易教程 洛谷科技 18-10-0223:31 简介 二叉排序树(Binary Sor ...