这个题应该是很容易想到贪心的,只要可是怎么贪才是科学的呢?
我们分析一下题干,对于每个边只能一进一出因此,对于树上的一棵子树,我们只要一进子树就必须遍历完,
因此我们只能进行一遍 dfs() 然后我们发现 dfs() 一遍的时间是一定的,
然后见每个妹子的时间就在这个时间轴上,
分析完了,我们说一下要贪什么。
我们先定义一个概念rest[]就是遍历完这个节点的子树以后我们还要为这个节点所费的时间
One_Stage :除了1节点,之外每个妹子一见面就杀du
Two_Stage :我们发现最后的答案是 Max(rest[1],c[1])+2*n-2
Three_Stage :然后我们考虑怎么找rest[1],
我们发现每个节点的最优rest[],是(子节点的rest[],减去其在这个子树里又经过的时间),再和(他的c[]减去遍历他的时间)取Max
这样我们线性一波就结局了

#include <cstdio>
#include <cstring>
#include <algorithm>
#include <vector>
#define MAXN 500005
using namespace std;
inline int read()
{
register int sum=;
register char ch=getchar();
while(ch<''||ch>'')ch=getchar();
while(ch>=''&&ch<='')
{
sum=(sum<<)+(sum<<)+ch-'';
ch=getchar();
}
return sum;
}
inline int Max(int x,int y)
{
return x>y?x:y;
}
int a[MAXN],m[MAXN],n,t[MAXN];
vector<int> Via[MAXN];
void Dfs_T(int x,int fa)
{
register int len=Via[x].size();
for(register int i=;i<len;++i)
if(Via[x][i]!=fa)
{
Dfs_T(Via[x][i],x);
t[x]+=+t[Via[x][i]];
}
}
inline void Init()
{
n=read();
for(register int i=;i<=n;i++)a[i]=read();
for(register int i=,x,y;i<n;i++)x=read(),y=read(),Via[x].push_back(y),Via[y].push_back(x);
Dfs_T(,);
}
int rest[MAXN];
int comp(const int x,const int y)
{
return rest[x]>rest[y];
}
inline void Dfs_A(int x,int fa)
{
register int len=Via[x].size();
for(register int i=;i<len;++i)
if(Via[x][i]!=fa)Dfs_A(Via[x][i],x);
sort(Via[x].begin(),Via[x].end(),comp);
if(x!=)rest[x]=a[x]-t[x];
register int now=t[x];
for(register int i=;i<len;i++)
if(Via[x][i]!=fa)
{
now-=+t[Via[x][i]];
rest[x]=Max(rest[x],rest[Via[x][i]]-now-);
}
if(rest[x]<)rest[x]=;
}
inline void Work()
{
Dfs_A(,);
register int ans=Max(rest[],a[])+t[];
printf("%d",ans);
}
int main()
{
Init();
Work();
return ;
}

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

  1. 【bzoj3829】[Poi2014]FarmCraft 贪心

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

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

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

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

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

  4. BZOJ3829 : [Poi2014]FarmCraft

    d[x]表示走完x的子树并回到x所需的时间 f[x]表示从走到x开始计时,x子树中最晚的点安装完的最早时间 d[x]=sum(d[i]+2),i是x的孩子 f[x]的计算比较复杂: 考虑将x的各棵子树 ...

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

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

  6. [补档][Poi2014]FarmCraft

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

  7. [BZOJ 3829][POI2014] FarmCraft

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

  8. bzoj 3829: [Poi2014]FarmCraft 树形dp+贪心

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

  9. [Poi2014]FarmCraft 树状dp

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

随机推荐

  1. JZOJ 5943. 树

    Description

  2. python网络编程的坑(持续更新)

    初学python,踩了许多坑...每天都学一点吧..(大佬绕过) 1.session的用法: session是python requests库中的一个重要功能.session可以存储用户的数据并且存储 ...

  3. Python3 利用pip安装BeautifulSoup4模块(Windows版)

    一.找到Python3的安装文件夹 二.将路径复制 三.Windows10 打开Windows PowerShell(管理员).Windows 8.8.1.7使用cmd 切换到相应目录 四.此目录下的 ...

  4. .net Core错误记录

    检测到包降级 打开Nuget,找到对应的包,Microsoft.NetCore.App 此时提示'已被SDK隐式引用,若要更新该包,请更新所属的SDK' 啥鸟意思??? 不管,直接解决,首先,安装对应 ...

  5. 在linux使用锐捷客户端上网(华中科技大学)

    第一步:下载锐捷客户端linux版本,下载网址为http://ncc.hust.edu.cn/cyxz/rzkhd.htm 第二步:解压该包,进入目录 #unzip RG_Supplicant_For ...

  6. mac 安装php redis扩展

    git clone git://github.com/nicolasff/phpredis.git cd ./phpredis phpize 如果报 Cannot find autoconf. Ple ...

  7. Scala学习笔记(一):环境搭建

    计算机领域的编程语言种类繁多,如C.C++.Java.C#等,我们知道的一般都是较为流行的编程语言,然有更多的是没听说过的,于是也就说不上关注或者使用了 一次在网上查资料时,无意间看到了“函数式编程” ...

  8. C#里的指针

    最近在复习C#基础这里,发现指针运算方式跟引用类型运算方式很相像. 指针里面存放的是表示内存地址的一段整数,所以任何整数类型指针之间都可以相互转换,因此带来了不安全性. ; long* b = &am ...

  9. python 网络编程(socketserver,阻塞,其他方法)

    重点回顾: (重点)粘包 : 就是因为接收端不知道如何接收数据,造成接收数据的混乱的问题 只发生在tcp协议上. 因为tcp协议的特点是面向数据流形式的传输 粘包的发生主要是因为tcp协议有两个机制: ...

  10. JVM 什么时候会触发FGC

    1:System.gc(); 2:老年代满了 没啥好说的从年轻代去往老年代的 3:JDK7或JDK6中永久区满了 得看是否还会有分配,如果没有就不会进行FGC,不过CMS GC下会看到不停地CMS G ...