题目

大意:

边权为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. 暑假集训#2 div1 J 四点直角 J - Space Invader 四点共面+跨立实验

    题意:给你四个点,判断能否先依次通过A,B两点,然后再在某个地方只进行一次直角转弯再一次经过C,D两点: #include <iostream> #include <cstdio&g ...

  2. 设置centos7界面语言为中文

    1.在终端中输入命令 vim ~/.bashrc 来编辑“.bashrc”文件 2.在最后添加“ export LANG="zh_CN.UTF-8"  ” 3.执行 sudo sh ...

  3. plt.plot() 无法使用参数ax

    问题参考 TypeError: inner() got multiple values for keyword argument 'ax' fig, ax=plt.subplots(2,1) plt. ...

  4. Spring boot之返回json数据

    1.步骤: 1. 编写实体类Demo 2. 编写getDemo()方法 3. 测试 2.项目构建 编写实体类Demo package com.kfit; /** * 这是一个测试实体类. */ pub ...

  5. 关于JDK8对List的分组汇总

    1. 跟据某个属性分组OfficeId: Map<String, List<IncomeSumPojo>> collect = list.stream().collect(Co ...

  6. maven web项目的web.xml报错The markup in the document following the root element must be well-formed.

    maven项目里面的web.xml开头约束是这样的 <?xml version="1.0" encoding="UTF-8"?> <web-a ...

  7. CSS Selectors

    CSS selectors are used to "find" (or select) HTML elements based on their element name, id ...

  8. 链表栈C语言实现

    #ifndef LINKSTACK_H_INCLUDED #define LINKSTACK_H_INCLUDED #include <stdlib.h> #include <std ...

  9. Ruby小白入门笔记之<Rails项目目录结构>

    一 .流程分析 二.目录分析 DemoRails app (核心) assets  (web前端所需文件) images       (图片) javascripts  (JS代码) styleshe ...

  10. java:Oracle(Jdbc的封装)和HTML(登录,注册,个人信息界面)

    1.Oracle Jdbc的封装: public class TestJdbc { // 把jdbc需要的属性,全部私有化 private static final String DRIVER = & ...