<更新提示>

<第一次更新>


<正文>

Description

滑稽树上滑稽果,滑稽树下你和我,滑稽树前做游戏,滑稽多又多。树上有 n 个节点,它们构成了一棵树,每个节点都有一个滑稽值。

一个大的连通块是指其中最大滑稽值和最小滑稽值之差不超过d。

每次你可以选择一个大的连通块并把它们删掉,请问你最少能用几次把这些节点都删掉呢?

Input Format

第一行两个整数 d 和 n。

第二行 n 个整数,分别表示每个节点的滑稽值。

接下来 n-1 行每行两个整数表示一条边。

Output Format

一行一个整数表示答案。

Sample Input

3 5
1 2 3 4 5
1 2
1 3
3 4
3 5

Sample Output

2

解析

一道思维题。

一看上去就很像树形\(dp\),不过限制好像很难维护。但是我们可以换一个方向考虑,我们把一个点权为\(a[x]\)的节点看做一个区间\([a[x],a[x]+d]\),那么一次合法的联通块删除操作必然满足至少有一个公共点被连通块内的所有区间覆盖。

想到这个就可以\(dp\)了,设\(g[x]\)代表删除子树\(x\)的最小代价,\(f[x][v]\)代表以\(x\)为根的子树中还存在一个未结算删除代价的连通块,其公共点为\(v\)的最小代价和。状态转移方程:

\[f[x][v]=\sum_{y\in son(x)}\min\{f[y][v],g[y]\},g[x]=\min_{v\in[a[x],a[x]+d]}\{f[x][v]+1\}
\]

第一个方程的含义就是要么直接删除一棵子树,要么连接到当前点的连通块里,待会一起删除。第二个方程的含义就是找一个公共点,然后在节点\(x\)处把未结算的代价结算掉,删除连通块。

\(Code:\)

#include <bits/stdc++.h>
using namespace std;
const int N = 5020;
struct edge { int ver,next; } e[N*2];
int n,d,t,Head[N],a[N],f[N][N],g[N];
inline void insert(int x,int y) { e[++t] = (edge){y,Head[x]} , Head[x] = t; }
inline void input(void)
{
scanf("%d%d",&d,&n);
for (int i=1;i<=n;i++)
scanf("%d",&a[i]);
for (int i=1;i<n;i++)
{
int x,y;
scanf("%d%d",&x,&y);
insert( x , y );
insert( y , x );
}
}
inline void dp(int x,int fa)
{
for (int i=a[x];i<=min(a[x]+d,5000);i++)
f[x][i] = 0;
for (int i=Head[x];i;i=e[i].next)
{
int y = e[i].ver;
if ( y == fa ) continue;
dp( y , x );
for (int j=a[x];j<=min(a[x]+d,5000);j++)
f[x][j] += min( f[y][j] , g[y] );
}
for (int i=a[x];i<=min(a[x]+d,5000);i++)
g[x] = min( g[x] , f[x][i] + 1 );
}
int main(void)
{
input();
memset( f , 0x3f , sizeof f );
memset( g , 0x3f , sizeof g );
dp( 1 , 0 );
printf("%d\n",g[1]);
return 0;
}

<后记>

『大 树形dp』的更多相关文章

  1. 『kamp 树形dp』

    kamp Description jz 市的云台山是个很美丽的景区,小 x 暑期到云台山打工,他的任务是开景区的大巴. 云台山景区有 N 个景点,这 N 个景点由 N-1 条道路连接而成,我们保证这 ...

  2. 『选课 树形dp 输出方案』

    这道题的树上分组背包的做法已经在『选课 有树形依赖的背包问题』中讲过了,本篇博客中主要讲解将多叉树转二叉树的做法,以便输出方案. 选课 Description 学校实行学分制.每门的必修课都有固定的学 ...

  3. 『You Are Given a Tree 整体分治 树形dp』

    You Are Given a Tree Description A tree is an undirected graph with exactly one simple path between ...

  4. 『战略游戏 最大利润 树形DP』

    通过两道简单的例题,我们来重新认识树形DP. 战略游戏(luoguP1026) Description Bob喜欢玩电脑游戏,特别是战略游戏.但是他经常无法找到快速玩过游戏的办法.现在他有个问题.他要 ...

  5. 『没有上司的舞会 树形DP』

    树形DP入门 有些时候,我们需要在树形结构上进行动态规划来求解最优解. 例如,给定一颗\(N\)个节点的树(通常是无根树,即有\(N-1\)条无向边),我们可以选择任意节点作为根节点从而定义出每一颗子 ...

  6. 『快乐链覆盖 树形dp』

    快乐链覆盖 Description 给定一棵 n 个点的树,你需要找至多 k 条互不相交的路径,使得它们的长度之和最大 定义两条路径是相交的:当且仅当存在至少一个点,使得这个点在两条路径中都出现 定义 ...

  7. 『树上匹配 树形dp』

    树上匹配 Description 懒惰的温温今天上班也在偷懒.盯着窗外发呆的温温发现,透过窗户正巧能看到一棵 n 个节点的树.一棵 n 个节点的树包含 n-1 条边,且 n 个节点是联通的.树上两点之 ...

  8. 『金字塔 区间dp』

    金字塔 Description 虽然探索金字塔是极其老套的剧情,但是这一队 探险家还是到了某金字塔脚下.经过多年的研究,科 学家对这座金字塔的内部结构已经有所了解.首先, 金字塔由若干房间组成,房间之 ...

  9. 『count 区间dp』

    count Description 既然是萌萌哒 visit_world 的比赛,那必然会有一道计数题啦! 考虑一个N个节点的二叉树,它的节点被标上了1-N的编号. 并且,编号为i的节点在二叉树的前序 ...

随机推荐

  1. GO 函数的参数

    一.函数 函数的参数 1.1 参数的使用 形式参数:定义函数时,用于接收外部传入的数据,叫做形式参数,简称形参. 实际参数:调用函数时,传给形参的实际的数据,叫做实际参数,简称实参. 函数调用: ​ ...

  2. 关于excel中的vlookup就是查找当前列对应的下一列的值的使用

    关于excel中的vlookup就是查找当前列对应的下一列的值的使用 vlookup的使用一些说明 vlookup函数一个4个参数解释下 vlookup(查找的值,表格范围,表格范围中第几列的值,0是 ...

  3. Winform中在ZedGraph中最多可以添加多少条曲线

    场景 Winforn中设置ZedGraph曲线图的属性.坐标轴属性.刻度属性: https://blog.csdn.net/BADAO_LIUMANG_QIZHI/article/details/10 ...

  4. idea使用心得

    简单的概括如下: IntelliJ系中的 Project  相当于Eclipse系中的  Workspace : IntelliJ系中的 Module  相当于Eclipse系中的  Project  ...

  5. 使用Wireshark进行DNS协议解析

    - 域名及解析过程 域名由一系列 - DNS协议报文格式 一次DNS过程包含一对请求报文和响应报文.请求和响应报文有统一的报文格式如下图: - DNS报文例子 一次DNS请求的过程: 包括请求和响应, ...

  6. Linux(ubuntu) 一行代码搞定查看文件目录

    ls 命令:• ls 是英文单词 list 的简写,其功能为列出目录的内容,是用户最常用的命令之一,类似于 DOS 下的 dir 命令 ls命令之后加各种参数的作用: ls -a 显示指定目录下所有子 ...

  7. Dockerfile语法简介

    Dockerfile是由一系列命令和参数构成的脚本,一个Dockerfile里面包含了构建整个image的完整命令.Docker通过docker build执行Dockerfile中的一系列命令自动构 ...

  8. selenium python 脚本不支持中文问题

    在 python shell 中执行以下脚本: ...... dr.find_element_by_xpath("//a[test()='查看']") ...... 点击 Run ...

  9. 关于 from scipy.misc import imread, imresize, imsave 报错的问题

    使用 from scipy.misc import imread, imresize, imsave 时出现报错,查找后发现新版本的Scipy不再包含imread,imresize,imsave,需要 ...

  10. HashMap底层实现及原理

    注意:文章的内容基于JDK1.7进行分析.1.8做的改动文章末尾进行讲解.       一.先来熟悉一下我们常用的HashMap: 1.HashSet和HashMap概述 对于HashSst及其子类而 ...