d[x]表示走完x的子树并回到x所需的时间

f[x]表示从走到x开始计时,x子树中最晚的点安装完的最早时间

d[x]=sum(d[i]+2),i是x的孩子

f[x]的计算比较复杂:

考虑将x的各棵子树按一定顺序排列,第i个走的子树是u,则它的贡献为sum(d[j]+2)+f[u]+1,j<i

即我们需要最小化max(sum(d[j]+2)+f[u]),设s[i]表示sum(d[j]+2),j<=i

对于序列中的两棵相邻子树i,j(i<j),交换它们只会影响它们两个的f[]

如果不交换比交换优

则有

max(s[i-1]+f[i],s[i-1]+d[i]+2+f[j])<max(s[i-1]+f[j],s[i-1]+d[j]+2+f[i])

max(f[i],d[i]+2+f[j])<max(f[j],d[j]+2+f[i])

以这个为cmp函数进行sort即可得到最优解序列,然后计算即可

f[x]=max(c[x],每个孩子的贡献)

ans=max(d[1]+c[1],f[1])

#include<cstdio>
#include<algorithm>
#define N 500010
int n,i,x,y,c[N],g[N],nxt[N<<1],v[N<<1],ed,d[N],f[N],a[N],t,sum;
inline void read(int&a){char ch;while(!(((ch=getchar())>='0')&&(ch<='9')));a=ch-'0';while(((ch=getchar())>='0')&&(ch<='9'))a*=10,a+=ch-'0';}
inline int max(int a,int b){return a>b?a:b;}
inline void up(int&a,int b){if(a<b)a=b;}
inline void add(int x,int y){v[++ed]=y;nxt[ed]=g[x];g[x]=ed;}
inline bool cmp(int x,int y){return max(f[x],d[x]+2+f[y])<max(f[y],d[y]+2+f[x]);}
void dfs(int x,int fa){
int i;
for(i=g[x];i;i=nxt[i])if(v[i]!=fa)dfs(v[i],x),d[x]+=d[v[i]]+2;
for(t=sum=0,i=g[x];i;i=nxt[i])if(v[i]!=fa)a[++t]=v[i];
if(t)for(std::sort(a+1,a+t+1,cmp),i=1;i<=t;sum+=d[a[i++]]+2)up(f[x],sum+f[a[i]]+1);
}
int main(){
read(n);
for(i=1;i<=n;i++)read(c[i]),f[i]=c[i];
for(i=1;i<n;i++)read(x),read(y),add(x,y),add(y,x);
dfs(1,0);
return printf("%d",max(d[1]+c[1],f[1])),0;
}

  

BZOJ3829 : [Poi2014]FarmCraft的更多相关文章

  1. BZOJ3829[Poi2014]FarmCraft——树形DP+贪心

    题目描述 In a village called Byteville, there are   houses connected with N-1 roads. For each pair of ho ...

  2. BZOJ3829 [Poi2014]FarmCraft 【树形dp】

    题目链接 BZOJ3829 题解 设\(f[i]\)为从\(i\)父亲进入\(i\)之前开始计时,\(i\)的子树中最晚装好的时间 同时记\(siz[i]\)为节点\(i\)子树大小的两倍,即为从父亲 ...

  3. [BZOJ3829][Poi2014]FarmCraft 贪心

    这个题应该是很容易想到贪心的,只要可是怎么贪才是科学的呢?我们分析一下题干,对于每个边只能一进一出因此,对于树上的一棵子树,我们只要一进子树就必须遍历完,因此我们只能进行一遍 dfs() 然后我们发现 ...

  4. 【BZOJ3829】[Poi2014]FarmCraft 树形DP(贪心)

    [BZOJ3829][Poi2014]FarmCraft Description In a village called Byteville, there are   houses connected ...

  5. [补档][Poi2014]FarmCraft

    [Poi2014]FarmCraft 题目 mhy住在一棵有n个点的树的1号结点上,每个结点上都有一个妹子. mhy从自己家出发,去给每一个妹子都送一台电脑,每个妹子拿到电脑后就会开始安装zhx牌杀毒 ...

  6. [BZOJ 3829][POI2014] FarmCraft

    先贴一波题面... 3829: [Poi2014]FarmCraft Time Limit: 20 Sec  Memory Limit: 128 MBSubmit: 421  Solved: 197[ ...

  7. 【bzoj3829】[Poi2014]FarmCraft 贪心

    原文地址:http://www.cnblogs.com/GXZlegend/p/6826667.html 题目描述 In a village called Byteville, there are   ...

  8. [bzoj3829][Poi2014]FarmCraft_树形dp

    FarmCraft 题目链接:https://lydsy.com/JudgeOnline/problem.php?id=3829 数据范围:略. 题解: 因为每条边只能必须走两次,所以我们的路径一定是 ...

  9. [Poi2014]FarmCraft 树状dp

    对于每个点,处理出走完其子树所需要的时间和其子树完全下载完软件的时间 易证,对于每个点的所有子节点,一定优先选择差值大的来给后面的时间 树规+贪心. #include<cstdio> #i ...

随机推荐

  1. sqlmap参数大全

    -u #注入点-f #指纹判别数据库类型-b #获取数据库版本信息-p #指定可测试的参数(?page=1&id=2 -p “page,id”)-D “”#指定数据库名-T “”#指定表名-C ...

  2. 使用HTML5 Web存储的localStorage和sessionStorage方式

    localStorage(本地存储),可以长期存储数据,没有时间限制,一天,一年,两年甚至更长,数据都可以使用.sessionStorage(会话存储),只有在浏览器被关闭之前使用,创建另一个页面时同 ...

  3. ICMP-type对应表

    一次在某个防火墙配置策略里看到如下的代码: iptables -A INPUT -p icmp --icmp-type 8 -j ACCEPT iptables -A FORWARD -p icmp ...

  4. VIM中的折叠命令

    参考:http://blog.csdn.net/bruce0532/article/details/8497284 za:在折叠与展开间自由转换 zf:创建折叠 示例:zf 3j    #本行及以下3 ...

  5. Android 中SimpleDateFormat的使用注意

    以前在程序中总这样使用  SimpleDateFormat sdf=new SimpleDateFormat("hh:mma");   date1=sdf.parse(alertT ...

  6. Java for LeetCode 164 Maximum Gap

    Given an unsorted array, find the maximum difference between the successive elements in its sorted f ...

  7. Tomcat AccessLog 格式化

    有的时候我们要使用日志分析工具对日志进行分析,需要对日志进行格式化,比如,要把accessLog格式化成这样的格式 c-ip s-ip x-InstancePort date time-taken x ...

  8. 好玩儿的expect

    前言 1> 借鉴里面的应用思想,使用断言提高代码的健壮性及维护性 2> 实现方式——不采用直接嵌入expect的方式,统一进行重写(提取常用断言方法,重新构造API) 官网介绍 https ...

  9. javascript中json解密

    一直以前都会断断续续会碰到js中的json数据的解析,下面凭着自己的经验,简单的讲解一下在js中的json的几种解析方法.  一.jquery的方式 首先你得先得到数据,一般都是jquery的ajax ...

  10. ASP.NET MVC那些事

    MVC的由来: 在MVC模式之前,View界面的呈现.用户交互操作的捕捉与相应.业务流程的执行以及数据的存储等都是在一起的,这种设计模式叫自治视图. 这重设计模式主要存在三大弊端: 重用性:业务逻辑与 ...