题目

大意:

边权为1 使遍历树时到每个节点的时间加上点权的最大值最小 求这个最小的最大值

思路:

最优化问题 一眼树形DP

考虑状态设立 先直接以答案为状态 dp[u] 为遍历完以u为根的子树的答案

再考虑状态转移 dp[u]=MAX(dp[to]+1,siz+dp[to]);siz为枚举子树到以to为节点的子树时之前已遍历的总时间

很明显这个转移过来的dp值的最优化依赖于子树遍历的顺序 所以我们需要找到一种最优的子树遍历顺序来使每个子树得到最优的dp值来更新

我们通过观察可以发现 交换任意两个相邻的子树在遍历时的顺序不会对它们之前的子树和之后的子树造成影响 所以我们考虑贪心 如果只有两个子树 a和b 遍历完子树a,b的时间分别为 siz[a],siz[b],dp值分别为dp[a],dp[b];

将 a优先遍历得到的dp值为MAX(dp[a]+1,siz[a]+dp[b]+3);

将 b优先遍历得到的dp值为MAX(dp[b]+1,siz[b]+dp[a]+3);

注意到取MAX时有一个值不被顺序影响 故只需要将后面的值最优化即可

我们假设a更优 则 siz[a]+dp[b]+3<siz[b]+dp[a]+3即siz[a]-dp[a]<siz[b]-dp[b]

将子树排序后转移即可

时间复杂度粗略估计(nlogn)

代码如下

 #include <cstdio>
#include <iostream>
#include <algorithm>
#define MAXX 500005
#define MAX(a,b) (a>b?a:b)
#define r(x) x=read()
using namespace std;
typedef long long ll;
int h[MAXX],cnt,u,to;
int top,n;
ll dp[MAXX],w[MAXX],siz[MAXX];
struct node{ ll a,b;}nod[MAXX];
struct edge{int to,nex;}e[MAXX<<];
void add(int u,int to)
{
cnt++;
e[cnt]=(edge){to,h[u]};
h[u]=cnt;
}
bool cmp(node a,node b){return a.b-a.a<b.b-b.a;}
void dfs(int now,int fa)
{
if(now!=) {dp[now]=w[now];}
for(int i=h[now];i;i=e[i].nex)
{
if(e[i].to==fa) continue;
dfs(e[i].to,now);
}
for(int i=h[now];i;i=e[i].nex)
{
if(e[i].to==fa) continue;
nod[++top]=(node){dp[e[i].to],siz[e[i].to]};
}
sort(nod+,nod+top+,cmp);
for(int i=;i<=top;++i)
{
dp[now]=MAX(dp[now],siz[now]++nod[i].a);
siz[now]+=nod[i].b+;
}
if(now==) dp[now]=MAX(dp[now],siz[now]+w[now]);
top=;
}
ll read()
{
ll w=,ff=;char ch=;
while(ch<''||ch>''){if(ch=='-')ff=-;ch=getchar();}
while(ch>=''&&ch<=''){w=w*+ch-'';ch=getchar();}
return w*ff;
}
int main()
{
r(n);
for(int i=;i<=n;++i)
r(w[i]);
for(int i=;i<n;++i)
r(u),r(to),add(u,to),add(to,u);
dfs(,);
printf("%lld",dp[]);
return ;
}

树形DP水题系列(1):FAR-FarmCraft [POI2014][luogu P3574]的更多相关文章

  1. POJ 2342 &&HDU 1520 Anniversary party 树形DP 水题

    一个公司的职员是分级制度的,所有员工刚好是一个树形结构,现在公司要举办一个聚会,邀请部分职员来参加. 要求: 1.为了聚会有趣,若邀请了一个职员,则该职员的直接上级(即父节点)和直接下级(即儿子节点) ...

  2. 树形DP水题杂记

    BZOJ1131: [POI2008]Sta 题意:给出一个N个点的树,找出一个点来,以这个点为根的树时,所有点的深度之和最大. 题解:记录每个点的深度,再根据根节点的深度和逐层推导出其他点的深度和. ...

  3. nyoj 1208——水题系列——————【dp】

    水题系列 时间限制:1000 ms  |  内存限制:65535 KB 难度:2   描述     给你一个有向图,每条边都有一定的权值,现在让你从图中的任意一点出发,每次走的边的权值必须必上一次的权 ...

  4. ACM :漫漫上学路 -DP -水题

    CSU 1772 漫漫上学路 Time Limit: 1000MS   Memory Limit: 131072KB   64bit IO Format: %lld & %llu Submit ...

  5. [poj2247] Humble Numbers (DP水题)

    DP 水题 Description A number whose only prime factors are 2,3,5 or 7 is called a humble number. The se ...

  6. POJ 1155 TELE 背包型树形DP 经典题

    由电视台,中转站,和用户的电视组成的体系刚好是一棵树 n个节点,编号分别为1~n,1是电视台中心,2~n-m是中转站,n-m+1~n是用户,1为root 现在节点1准备转播一场比赛,已知从一个节点传送 ...

  7. POJ 2342 树形DP入门题

    有一个大学的庆典晚会,想邀请一些在大学任职的人来參加,每一个人有自己的搞笑值,可是如今遇到一个问题就是假设两个人之间有直接的上下级关系,那么他们中仅仅能有一个来參加,求请来一部分人之后,搞笑值的最大是 ...

  8. Codeforces 148D 一袋老鼠 Bag of mice | 概率DP 水题

    除非特别忙,我接下来会尽可能翻译我做的每道CF题的题面! Codeforces 148D 一袋老鼠 Bag of mice | 概率DP 水题 题面 胡小兔和司公子都认为对方是垃圾. 为了决出谁才是垃 ...

  9. 51nod 1353 树 | 树形DP经典题!

    51nod 1353 树 | 树形DP好题! 题面 切断一棵树的任意条边,这棵树会变成一棵森林. 现要求森林中每棵树的节点个数不小于k,求有多少种切法. 数据范围:\(n \le 2000\). 题解 ...

随机推荐

  1. oracle(转)

    Oracle数据库基本操作 1.概述 Oracle数据库客户端一般需要安装在服务器上,可以在服务器端操作,一般我们可以用sql developer工具远程连接到数据库,先行建立数据库,然后对表进行增删 ...

  2. php curl方法 支持 http https get post cookie

    //请求方式curl封装 @author Geyaru QQ 534208139 参数1:访问的URL,参数2:post数据(不填则为GET),参数3:提交的$cookies,参数4:是否返回$coo ...

  3. SpringBoot 使用定时任务动态执行任务

    import com.patient.core.adapter.CorsFilter; import org.mybatis.spring.annotation.MapperScan; import ...

  4. 第九周学习总结&实验报告(7)

    完成火车站售票程序的模拟. 要求: (1)总票数1000张; (2)10个窗口同时开始卖票; (3) 卖票过程延时1秒钟; (4)不能出现一票多卖或卖出负数号票的情 况 实验代码: package y ...

  5. vue-preview 缩略图

    如果我们在 vue 中想使用缩略图的话,可以使用 vue-preview 的插件 小图的缩略 大图的样式 使用方法:vue-preview 下  载:   npm i vue-preview 使用方法 ...

  6. ffmpeg命令合流声卡和麦克风声音进行直播

    ffmpeg -f dshow -i audio=:duration=first:dropout_transition= -f dshow -i video= -ac -f flv -y d:/tes ...

  7. 五一 DAY 6

    五一  DAY 6 TypeName   类型名 VariableName  变量名 Part 1 数据结构 函数库:# include < utility > Pair 定义一个变量,它 ...

  8. 阶段3 2.Spring_10.Spring中事务控制_5 spring事务控制的代码准备

    创建一个工程,只搭建环境不做配置.等配置的时候把这个项目相关的代码再复制到新项目里面 jar包的打包方式 导入包 事务控制也是基于AOP的.所以这里导入aspectjweaver 复制jdbcTemp ...

  9. 阶段3 2.Spring_03.Spring的 IOC 和 DI_12 注入集合数据

    再复制一份,改名3 常用的注入方式,这里选择set saveAccount方法输出所有的对象 map需要导包 配置xml 集合类型的值配置方式 在property标签里面再写标签 这里选择array. ...

  10. eigenvalues problem

    由于在看paper中经常会看到generalized eigenvalues.eigenvalues problem等字眼,今晚终于开始认真地重新看了一下线性代数中这部分内容.下面是在学习过程中找出来 ...