【BZOJ3829】[Poi2014]FarmCraft 树形DP(贪心)
【BZOJ3829】[Poi2014]FarmCraft
Description
Input
Output
Sample Input
1 8 9 6 3 2
1 3
2 3
3 4
4 5
4 6
Sample Output
HINT
题解:设f[x]为x的子树中全部安完软件的时间,对于x节点的a,b儿子,设他们的子树大小为siz[a],siz[b],显然遍历一遍子树a的时间就是2*siz[a],然后分类讨论
若先走a,后走b,那么f[x]=max(f[a]+1,f[b]+2*siz[a]+1)
若先走b,后走a,那么f[x]=max(f[a]+2*siz[b]+1,f[b]+1)
对于f[a]+1和f[b]+1我们可以不用考虑,那么如果先走a更优,当且仅当:
f[b]+2*siz[a]+1<f[a]+2*siz[b]+1
移项
f[a]-2*siz[a]>f[b]-2*siz[b]
那么直接将x的儿子按照f[i]-2*siz[i]排序,先走f[i]-2*siz[i]的就好了
注意根节点的软件是最后安装的,所以要特判,ans=max(2*(n-1)+1+time[1],f[1])
#include <cstdio>
#include <iostream>
#include <cstring>
#include <algorithm>
using namespace std;
const int maxn=500010;
int n,cnt;
int to[maxn<<1],next[maxn<<1],head[maxn],v[maxn],p[maxn],f[maxn],siz[maxn];
void add(int a,int b)
{
to[cnt]=b,next[cnt]=head[a],head[a]=cnt++;
}
bool cmp(int a,int b)
{
return f[a]-2*siz[a]>f[b]-2*siz[b];
}
void dfs(int x,int fa)
{
int i,sum=0;
siz[x]=1;
for(i=head[x];i!=-1;i=next[i]) if(to[i]!=fa)
dfs(to[i],x),siz[x]+=siz[to[i]];
p[0]=0;
for(i=head[x];i!=-1;i=next[i]) if(to[i]!=fa) p[++p[0]]=to[i];
sort(p+1,p+p[0]+1,cmp);
if(x!=1) f[x]=v[x];
for(i=1;i<=p[0];i++) f[x]=max(f[x],f[p[i]]+sum+1),sum+=2*siz[p[i]];
}
int main()
{
scanf("%d",&n);
int i,a,b;
memset(head,-1,sizeof(head));
for(i=1;i<=n;i++) scanf("%d",&v[i]);
for(i=1;i<n;i++) scanf("%d%d",&a,&b),add(a,b),add(b,a);
dfs(1,0);
printf("%d",max(f[1],2*(siz[1]-1)+v[1]));
return 0;
}
【BZOJ3829】[Poi2014]FarmCraft 树形DP(贪心)的更多相关文章
- BZOJ3829[Poi2014]FarmCraft——树形DP+贪心
题目描述 In a village called Byteville, there are houses connected with N-1 roads. For each pair of ho ...
- bzoj 3829: [Poi2014]FarmCraft 树形dp+贪心
题意: $mhy$ 住在一棵有 $n$ 个点的树的 $1$ 号结点上,每个结点上都有一个妹子. $mhy$ 从自己家出发,去给每一个妹子都送一台电脑,每个妹子拿到电脑后就会开始安装 $zhx$ 牌杀毒 ...
- [POI2014]FAR-FarmCraft 树形DP + 贪心思想
(感觉洛谷上题面那一小段中文根本看不懂啊,好多条件都没讲,直接就是安装也要一个时间啊,,,明明不止啊!还好有百度翻译......) 题意:一棵树,一开始在1号节点(root),边权都为1,每个点有点权 ...
- POI2014 FAR-FarmCraft 树形DP+贪心
题目链接 https://www.luogu.org/problem/P3574 题意 翻译其实已经很明确了 分析 这题一眼就是贪心啊,但贪心的方法要思索一下,首先是考虑先走时间多的子树,但不太现实, ...
- [bzoj3829][Poi2014]FarmCraft_树形dp
FarmCraft 题目链接:https://lydsy.com/JudgeOnline/problem.php?id=3829 数据范围:略. 题解: 因为每条边只能必须走两次,所以我们的路径一定是 ...
- 【bzoj4027】[HEOI2015]兔子与樱花 树形dp+贪心
题目描述 很久很久之前,森林里住着一群兔子.有一天,兔子们突然决定要去看樱花.兔子们所在森林里的樱花树很特殊.樱花树由n个树枝分叉点组成,编号从0到n-1,这n个分叉点由n-1个树枝连接,我们可以把它 ...
- 【BZOJ3522】[Poi2014]Hotel 树形DP
[BZOJ3522][Poi2014]Hotel Description 有一个树形结构的宾馆,n个房间,n-1条无向边,每条边的长度相同,任意两个房间可以相互到达.吉丽要给他的三个妹子各开(一个)房 ...
- [BZOJ1596] [Usaco2008 Jan]电话网络(树形DP || 贪心)
传送门 1.树形DP #include <cstdio> #include <cstring> #include <iostream> #define N 1000 ...
- BZOJ3522[Poi2014]Hotel——树形DP
题目描述 有一个树形结构的宾馆,n个房间,n-1条无向边,每条边的长度相同,任意两个房间可以相互到达.吉丽要给他的三个妹子各开(一个)房(间).三个妹子住的房间要互不相同(否则要打起来了),为了让吉丽 ...
随机推荐
- Asp.Net MVC之防止用户注入脚本参数
假设有一个Controller,代码如下: public string Browse(string genre) { string message = "Store.Browse, Genr ...
- 浅谈ThreadPool 线程池(引用)
出自:http://www.cnblogs.com/xugang/archive/2010/04/20/1716042.html 浅谈ThreadPool 线程池 相关概念: 线程池可以看做容纳线程的 ...
- openssl 创建证书的总结和注意事项
1.该文章从网上看了好多博客,并经过实践形成.环境为ubuntu12和ubuntu14 "========================================大纲提要和注意事项= ...
- Java 继承、多态与类的复用
摘要: 本文结合Java的类的复用对面向对象两大特征继承和多态进行了全面的介绍. 首先,我们介绍了继承的实质和意义,并探讨了继承,组合和代理在类的复用方面的异同.紧接着,我们依据继承引入了多态.介绍了 ...
- .Net程序员面试 中级篇 (回答Scott Hanselman的问题)
继<.Net 程序员面试 C# 语言篇 (回答Scott Hanselman的问题)>跟<.Net程序员面试 每个人都应知道篇 (回答Scott Hanselman的问题)>之 ...
- 运行百度语音识别官方iOS demo报错: load offline engine failed: 4001
运行官方BDVRClientSample这个demo(ios版的),demo可以安到手机上,但是点“识别UI”那个按钮后“授权验证失败”.如果点“语音识别”那个按钮,控制台输出:2015-10-23 ...
- Cocos2d-x 3.1.1 Lua演示样例 ActionsProgressTest(进度条)
Cocos2d-x 3.1.1 Lua演示样例 ActionsProgressTest(进度条) 本篇博客介绍Cocos2d-x中的进度条动画,进度条涉及以下几个重要的类和方法,笔者来给大家具体解说一 ...
- python之读取Excel 文件
# -*- coding: utf-8 -*- """ Created on Thu May 24 13:53:10 2018 @author: Frank " ...
- Jquery学习笔记(5)--jquery1.6中的.prop()和.attr()异同
jquery1.6中的.prop()和.attr()异同 最近在iteye的新闻中看到jQuery已经更新到了1.6.1.和之前版本的最大变化是增加了.prop方法.但是.prop()方法和.attr ...
- SessionListener失败,退出
配置如下: web.xml: <listener> <listener-class>cn.edu.hbcf.common.listener.SessionListener< ...