<更新提示>

<第一次更新>


<正文>

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. java Integer中隐藏的细节魔鬼!来自面试官的三轮暴击!

    1 第一波暴击!!! 程序员比较实在,一般会说: 那就先上代码 package com.example.demo; public class TestInteger { public static v ...

  2. three.js实现世界3d地图

    概况如下: 1.THREE.Shape绘制世界地图平面地图: 2.THREE.ExtrudeGeometry将绘制的平面沿着Z轴拉伸,实现3d效果: 效果图如下: 预览地址:three.js实现世界3 ...

  3. MySQL 中的索引

    索引用来加速查询.正常来说,当查询数据时,MySQL 需要从表的第一条记录开始,读取整个表的内容,进行查询. 但如果有索引,MySQL 可根据索引快速定位需要查询条目的具体位置,加快了查询速度. 原理 ...

  4. mybatis动态sql和分页

    mybatis动态sql foreach BookMapper.xml <select id="selectBooksIn" resultType="com.lin ...

  5. MySQL的5大引擎及优劣之分

    MySQL提供了多个不同的存储引擎,其中5大引擎有:innodb,myisam,memory,merge,csv. 其中优点有:灾难恢复性好.支持事务.使用行级锁.支持外键关联.支持热备份 缺点如下: ...

  6. JavaScript中break、continue和return的区别

    break function myBreak() { for(var i = 0; i < 5; i++) { if(i == 3) { break; } console.log(i); } } ...

  7. 后端返回null,前端怎么处理?数据容错——不用过分相信外部数据

    场景 我们在开发过程当中,总是会遇到因为数据原因,导致使用数组方法或者获取对象属性的时候报错. xxx is not fuction Cannot read property xxxx of unde ...

  8. 【微信小程序】App.js生命周期

    1.小程序的生命周期-App.js App() 必须在 app.js 中注册,且不能注册多个.所以App()方法在一个小程序中有且仅有一个. App({ onLaunch: function () { ...

  9. [b0020] python 归纳 (六)_模块变量作用域

    test_module2.py: # -*- coding: utf-8 -*-"""测试 模块变量的作用域 总结:1 其他模块的变量,在当前模块的任何地方,包括函数都可 ...

  10. Spring Cloud Netflix Hystrix介绍和使用

    前面我们搭建了具有服务降级功能的Hystrix客户端,现在我们来详细了解下Hystrix的一些功能. Hystrix的意思是豪猪,大家都知道,就是长满刺的猪...实际上,它表明了该框架的主要功能:自我 ...