Problem 有效集合

题目大意

给出一棵树,求出这棵树的不同联通子节点集合的数量,这些集合必须满足最大权值点减最小权值点小于等于d。

Solution

再一次树d乱搞。

因为数据范围贼小,所以我们对于每一个点为根的情况进行一次dfs.

对于以节点root为根的情况,我们认为root是最小值。

对于root的某一棵子树,其需要算的情况一定包含root,否则前面已经算过了。

于是我们就对这个root进行dfs。dfs过程中,我们始终保证root为最小值,不遍历大于它的点。

因为有了这个性质,我们只要不走加起来大于d的点,接下来所有的点都不属于被计算范围内,可以不走。

在这个以root为根的树中,现在我们遍历到u,选中它的一颗子树v。

对于这一串东西上,我们每次可以选择以前已遍历过的子树中选择某些点,再从v该棵子树下选择某些点组成新情况。

我们增加的情况是已经遍历过的子树答案*(该子树被遍历到的子树总答案+1)

加一是因为空集也算是一种情况。

也就是f[u]*=f[v]+1;

对于每个叶子结点,我们只需要将f设为1即可。

dfs完以后,我们将以每个点为根(最小值)的情况进行累加。

于是最终的ans便是答案。

需要注意的是,这一道题MOD1000000007

所以f数组、ans变量需要long long类型

而我一直爆炸,因为没注意到,dfs函数也要为long long类型。

所以请注意这个问题。

AC Code

#include <iostream>
#include <cstdio>
#include <cstring>
#define MOD 1000000007
using namespace std;
struct node{
int to,next;
}e[];
int d,n,u,v,h[],a[],tot=;
long long f[],ans=;
void add(int u,int v){
e[++tot].to=u;e[tot].next=h[v];h[v]=tot;
e[++tot].to=v;e[tot].next=h[u];h[u]=tot;
}
long long dfs(int x,int last,int root){
long long ans=;
f[x]=;
for(int i=h[x];~i;i=e[i].next){
if(last!=e[i].to&&(a[e[i].to]>a[root]||(a[e[i].to]==a[root]&&root>e[i].to))
&&a[e[i].to]-a[root]<=d){
ans=(ans*(dfs(e[i].to,x,root)+)%MOD)%MOD;
}
}
return ans;
}
int main(){
// freopen("cf486d.in","r",stdin);
memset(h,-,sizeof(h));
scanf("%d%d",&d,&n);
for(int i=;i<=n;i++)scanf("%d",&a[i]);
for(int i=;i<n;i++){
scanf("%d%d",&u,&v);
add(u,v);
}
for(int i=;i<=n;i++)ans+=dfs(i,,i);
printf("%lld",ans%MOD);
}

[CF486D]有效集合-树形dp的更多相关文章

  1. BZOJ 4455: [Zjoi2016]小星星 [容斥原理 树形DP]

    4455: [Zjoi2016]小星星 题意:一个图删掉一些边形成一棵树,告诉你图和树的样子,求让图上的点和树上的点对应起来有多少方案 看了很多题解又想了一段时间,感觉题解都没有很深入,现在大致有了自 ...

  2. 树形DP题目集合

    [树形DP](https://cn.vjudge.net/contest/123963#overview) #include<cstdio> #include<string> ...

  3. CF 486D vailid set 树形DP

    As you know, an undirected connected graph with n nodes and n - 1 edges is called a tree. You are gi ...

  4. POJ 3342 (树形DP)

    题意 :给出一些上下级关系,要求i和i的直接上级不能同时出现,现在选出一些人构成一个集合,问你这个集合里面的最大人数是都少,同时给出这个最大的人数的集合是否唯一. 思路:树形DP,dp[i][0],表 ...

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

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

  6. 洛谷P1040 加分二叉树(树形dp)

    加分二叉树 时间限制: 1 Sec  内存限制: 125 MB提交: 11  解决: 7 题目描述 设一个n个节点的二叉树tree的中序遍历为(l,2,3,...,n),其中数字1,2,3,...,n ...

  7. Codeforces 1097G Vladislav and a Great Legend [树形DP,斯特林数]

    洛谷 Codeforces 这题真是妙的很. 通过看题解,终于知道了\(\sum_n f(n)^k​\)这种东西怎么算. update:经过思考,我对这题有了更深的理解,现将更新内容放在原题解下方. ...

  8. 树形动态规划(树形DP)入门问题—初探 & 训练

    树形DP入门 poj 2342 Anniversary party   先来个题入门一下~ 题意: 某公司要举办一次晚会,但是为了使得晚会的气氛更加活跃,每个参加晚会的人都不希望在晚会中见到他的直接上 ...

  9. BZOJ4455 ZJOI2016小星星(容斥原理+树形dp)

    相当于给树上的每个点分配一个编号使父亲和儿子间都有连边. 于是可以考虑树形dp:设f[i][j][k]为i号点的编号为j,其子树中编号集合为k的方案数.转移显然.然而复杂度3n·n3左右,具体我也不知 ...

随机推荐

  1. 全景智慧城市常诚——一个实体商家“自剖”VR全景的势在必得

    谈起"智慧城市",你的心中是否充满了期待?随着互联网的发展,人们对于"智慧城市"的需求越来越迫切.现在想想,我也算是首批入驻全景智慧城市的商家之一了.在各种连锁 ...

  2. 如何在vuejs中抽出公共代码

    当我们在使用vue构建中大型项目时,通常会遇到某些经常用的方法以及属性,比如说搭建一个员工管理系统,请求的url需要一个共同的前缀,或者在某几个view中需要用到时间,这个时间是通过某方法格式化之后的 ...

  3. Dubbo源码分析系列---扩展点加载

    扩展点配置: 约定: 在扩展类的jar包内,放置扩展点配置文件:META-INF/dubbo/接口全限定名,内容为:配置名=扩展实现类全限定名,多个实现类用换行符分隔.(摘自dubbo文档) 示例: ...

  4. 表单的get和post使用情景

    GET和POST两种方法都是将数据送到服务器,但你该用哪一种呢? HTTP标准包含这两种方法是为了达到不同的目的.POST用于创建资源,资源的内容会被编入HTTP请示的内容中.例如,处理订货表单.在数 ...

  5. webuploader插件,我踩得坑

    我在目前的公司做的项目要么是原生写法去做项目,要么就是vue+webpack做项目,但是vue这部分只是用了模板template,vue其他的都没用. 有一个项目需要做上传图片的功能,老大扔给我一个插 ...

  6. [0] Lc.exe 已退出,代码 -1

    可能的原因是:在你的项目中引用了第三方组件,并且这个第三方组件是个商业组件,他在组件的主使用类定义了LicenseProvider(typeof(LicFileLicenseProvider))这个A ...

  7. R语言重要数据集分析研究——搞清数据的由来

    搞清数据的由来 作者:李雪丽 资料来源:百度百科

  8. CSS都有哪些选择器?

    派生选择器(用HTML标签申明) id选择器(用DOM的ID申明) 类选择器(用一个样式类名申明) 属性选择器(用DOM的属性申明,属于CSS2,IE6不支持,不常用,不知道就算了) 除了前3种基本选 ...

  9. 从Html5直播到互动直播,看直播协议的选择

    目前,国内主流的直播协议有HLS.RTMP.HTTP FLV,适用于不同的直播场景. 一.HLS.RTMP与HTTP FLV 1.HLS HLS 全称是 HTTP Live Streaming, 是一 ...

  10. jquery让页面滚动条top,滚动条 顶部

    jquery让页面滚动条top,滚动条 顶部$(document).scrollTop(0);