这题首先手玩一下一下数据,写出每个节点修建软件所需要的时间和到达它的时间戳(第一次到达它的时间),不难发现实际上就是要最小化这两者之和。然后就想到:一棵子树内,时间戳必然是连续的一段区间,而如果将访问到子树根节点的时间看做0时,则是一段0~x的连续时间,与其他子树的分配无关。所以自然的联想到单独处理出dp[u]:以u为根节点,访问时间看做0的时候其中节点所需要的时间最大值。

  如何从dp[v]转移到dp[u]?首先随便给它们分配一个顺序,则每一个节点的最后最大值(原先的值建立在访问根节点的时间为0的基础上,但现在的根节点变成了原来根节点的父亲)=原来的dp值+分配的顺序所带来的时间差。我们分析应怎样分配这个顺序使得它们的最大值最小。

  我们有

        dp[u] = max{ dp[a] , dp[b] + size[a] + 2 };
        dp[u] = max{ dp[u] , max{ dp[b], dp[a] + size[b] + 2 }}; // size[x] 代表访问x子树的全部节点所需要的时间

  这个应该不难看出:实际上就是枚举了两种情况。那么如果第一次取得的值要小于第二次取得的值,我们就认为将第一个放在第二个前面是更优的。之所以+2,是因为由u->v的边还需要经过2次。

// luogu-judger-enable-o2
#include <bits/stdc++.h>
using namespace std;
#define maxn 600000
#define int long long
int n, a[maxn], size[maxn];
int cnp = , dp[maxn], head[maxn]; int read()
{
int x = ;
char c;
c = getchar();
while(c < '' || c > '') c = getchar();
while(c >= '' && c <= '') x = x * + c - '', c = getchar();
return x;
} struct node
{
int id, num, s;
}P[maxn]; struct edge
{
int to, last;
}E[maxn * ]; bool cmp (node a, node b)
{
int p = max(a.num, b.num + a.s + );
int q = max(b.num, a.num + b.s + );
return p < q;
} void add(int u, int v)
{
E[cnp].to = v, E[cnp].last = head[u]; head[u] = cnp ++;
} void DP(int u, int fa)
{
if(u != ) dp[u] = a[u];
for(int i = head[u]; i; i = E[i].last)
{
int v = E[i].to;
if(v == fa) continue;
DP(v, u);
}
int tot = , last = ;
for(int i = head[u]; i; i = E[i].last)
if(E[i].to != fa) P[++ tot] = (node) {E[i].to, dp[E[i].to], size[E[i].to]};
if(tot)
{
sort(P + , P + + tot, cmp);
for(int i = ; i <= tot; i ++)
{
int v = P[i].id;
dp[u] = max(dp[u], dp[v] + (size[u] + ));
size[u] += size[v] + ;
}
}
} signed main()
{
n = read();
for(int i = ; i <= n; i ++) a[i] = read();
for(int i = ; i < n; i ++)
{
int x = read(), y = read();
add(x, y), add(y, x);
}
DP(, );
printf("%lld\n", max(dp[], (n - ) * + a[]));
return ;
}

【题解】POI2014FAR-FarmCraft的更多相关文章

  1. FarmCraft[POI2014]

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

  2. POI2014题解

    POI2014题解 [BZOJ3521][Poi2014]Salad Bar 把p当作\(1\),把j当作\(-1\),然后做一遍前缀和. 一个合法区间\([l,r]\)要满足条件就需要满足所有前缀和 ...

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

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

  4. 【bzoj3829】[Poi2014]FarmCraft 贪心

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

  5. FarmCraft --(树形DP)

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

  6. 【树形dp】Farmcraft

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

  7. P3574 FAR-FarmCraft 题解

    题目 In a village called Byteville, there are \(n\) houses connected with \(n-1\) roads. For each pair ...

  8. 2016 华南师大ACM校赛 SCNUCPC 非官方题解

    我要举报本次校赛出题人的消极出题!!! 官方题解请戳:http://3.scnuacm2015.sinaapp.com/?p=89(其实就是一堆代码没有题解) A. 树链剖分数据结构板题 题目大意:我 ...

  9. noip2016十连测题解

    以下代码为了阅读方便,省去以下头文件: #include <iostream> #include <stdio.h> #include <math.h> #incl ...

  10. BZOJ-2561-最小生成树 题解(最小割)

    2561: 最小生成树(题解) Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 1628  Solved: 786 传送门:http://www.lyd ...

随机推荐

  1. 【ntp时间校准配置】

    Ntp(网络时间协议)是一种可以通过TCP/IP网络传播,其架构模式可分为C/S(客户端/服务器),PTP(对等),broatcast(广播), mutilbrocast(组播),无论在任何系统或设备 ...

  2. svg在html的使用

    <svg xmlns='http://www.w3.org/2000/svg' xmlns:xlink='http://www.w3.org/1999/xlink'> <defs&g ...

  3. 001---C/S架构

    C/S 架构介绍 什么是C/S架构 C:client,客户端 S:server,服务端 实现客户端和服务端之间的网络通信 什么是网络 人与人之间交流是通过语言,才能彼此理解对方的意思.但是地球上有多个 ...

  4. LeetCode算法1—— 两数之和

    给定一个整数数组和一个目标值,找出数组中和为目标值的两个数. 你可以假设每个输入只对应一种答案,且同样的元素不能被重复利用. 示例: 给定 nums = [2, 7, 11, 15], target ...

  5. java web项目使用ant编译将不同的功能代码打包成jar,进而分局点将项目打包成不同的tar.gz包进而部署

    使用ant可以轻松的将一个项目分离代码,直接打包成不同需求的tar.gz包使用 1.build.properties (属性) version.num=1.0 #版本信息 2.build.xml (a ...

  6. spfa专题

    SPFA专题 1通往奥格瑞玛的道路 在艾泽拉斯,有n个城市.编号为1,2,3,...,n. 城市之间有m条双向的公路,连接着两个城市,从某个城市到另一个城市,会遭到联盟的攻击,进而损失一定的血量. 每 ...

  7. Java之枚举笔记(Enum)

    package com.simope.ljm; public class MyEnum { public static void main(String[] args) { System.out.pr ...

  8. svn资源库url问题

    今天连接svn资源库的时候一直出现 RA layer request failedsvn: Unable to connect to a repository at URL http://... sv ...

  9. 「暑期训练」「Brute Force」 Multiplication Table (CFR256D2D)

    题意 给定一矩阵M" role="presentation">MM,Mij=ij" role="presentation">Mi ...

  10. beanshell引用参数化数据

    步骤: 1.添加参数化组件CSV Data Set  Config: 2.添加beanshell preprocessor,引用变量: 验证: 2个线程,迭代2次,分别取了4个不同的值.