D. Valid Sets

time limit per test

1 second

memory limit per test

256 megabytes

input

standard input

output

standard output

As you know, an undirected connected graph with n nodes and n - 1 edges is called a tree. You are given an integer d and a tree consisting of n nodes. Each node i has a value ai associated with it.

We call a set S of tree nodes valid if following conditions are satisfied:

S is non-empty.
S is connected. In other words, if nodes u and v are in S, then all nodes lying on the simple path between u and v should also be presented in S.
.

Your task is to count the number of valid sets. Since the result can be very large, you must print its remainder modulo 1000000007 (109 + 7).

Input

The first line contains two space-separated integers d (0 ≤ d ≤ 2000) and n (1 ≤ n ≤ 2000).

The second line contains n space-separated positive integers a1, a2, ..., an(1 ≤ ai ≤ 2000).

Then the next n - 1 line each contain pair of integers u and v (1 ≤ u, v ≤ n) denoting that there is an edge between u and v. It is guaranteed that these edges form a tree.

Output

Print the number of valid sets modulo 1000000007.

Examples

Input

Copy

1 4

2 1 3 2

1 2

1 3

3 4

Output

8

Input

Copy

0 3

1 2 3

1 2

2 3

Output

3

Input

Copy

4 8

7 8 7 5 4 6 4 10

1 6

1 2

5 8

1 3

3 5

6 7

3 4

Output

41

Note

In the first sample, there are exactly 8 valid sets: {1}, {2}, {3}, {4}, {1, 2}, {1, 3}, {3, 4} and {1, 3, 4}. Set {1, 2, 3, 4} is not valid, because the third condition isn't satisfied. Set {1, 4} satisfies the third condition, but conflicts with the second condition.

题解

直接统计不好统计,所以考虑把方案分类。

按照最大值点对方案分类,枚举一个最大值点,让这一个点在方案中,这样就确定了方案能包含的连通块。

设\(dp[i]\)表示一定包含i这个点且i这个点是方案中权值最大的点的方案,有

\[dp[i] = \prod (dp[son_i] + 1)
\]

这样会计算重。因为最大值点所确定的连通块里,可能有多个与最大值点权值相同的点,每个点都会算一遍。

只算一个,然后乘以连通的相同值点的个数?

不!别忘了我们\(dp\)的时候,要求选定的点必须在方案中。必定包含不同的相同最大权值点的方案并不是一一对应的。

怎么办?

继续把方案分类。

在这个包含多个最大值点的极大连通块里,设有\(k\)个相同的最大值点。

设最大的相同点编号为\(x\),\(dp\)必定包含点x的集合就行了。

这就相当于,我们只走比他编号小的相同权值的点。

两次使用最大值分类方案的神题Orz

被long long 和 MOD卡了两次。。

#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <algorithm>
#include <map>
#include <cmath>
inline long long max(long long a, long long b){return a > b ? a : b;}
inline long long min(long long a, long long b){return a < b ? a : b;}
inline long long abs(long long x){return x < 0 ? -x : x;}
inline void swap(long long &x, long long &y){long long tmp = x;x = y;y = tmp;}
inline void read(long long &x)
{
x = 0;char ch = getchar(), c = ch;
while(ch < '0' || ch > '9') c = ch, ch = getchar();
while(ch <= '9' && ch >= '0') x = x * 10 + ch - '0', ch = getchar();
if(c == '-') x = -x;
}
const long long INF = 0x3f3f3f3f;
const long long MAXN = 2000 + 10;
const long long MOD = 1000000007;
struct Edge
{
long long u,v,nxt;
Edge(long long _u, long long _v, long long _nxt){u = _u, v =_v, nxt = _nxt;}
Edge(){}
}edge[MAXN << 1];
long long head[MAXN], cnt, n, val[MAXN], d, dp[MAXN], ans;
inline void insert(long long a, long long b)
{
edge[++ cnt] = Edge(a, b, head[a]), head[a] = cnt;
}
void dfs(long long x, long long pre, long long root)
{
dp[x] = 1;
for(long long pos = head[x];pos;pos = edge[pos].nxt)
{
long long v = edge[pos].v;
if(v == pre || val[root] - val[v] < 0 || val[root] - val[v] > d || (val[v] == val[root] && v > root)) continue;
dfs(v, x, root);
dp[x] *= (dp[v] + 1), dp[x] %= MOD;
}
}
int main()
{
read(d), read(n);
for(long long i = 1;i <= n;++ i) read(val[i]);
for(long long i = 1;i < n;++ i)
{
long long tmp1, tmp2;
read(tmp1), read(tmp2);
insert(tmp1, tmp2), insert(tmp2, tmp1);
}
for(long long i = 1;i <= n;++ i)
{
memset(dp, 0, sizeof(dp));
dfs(i, -1, i);
ans += dp[i] % MOD;
if(ans >= MOD) ans -= MOD;
}
printf("%I64d", ans);
return 0;
}

Codeforces 486D. Valid Sets的更多相关文章

  1. Codeforces 486D Valid Sets (树型DP)

    题目链接 Valid Sets 题目要求我们在一棵树上计符合条件的连通块的个数. 满足该连通块内,点的权值极差小于等于d 树的点数满足 n <= 2000 首先我们先不管这个限制条件,也就是先考 ...

  2. Codeforces 486D Valid Sets:Tree dp【n遍O(n)的dp】

    题目链接:http://codeforces.com/problemset/problem/486/D 题意: 给你一棵树,n个节点,每个节点的点权为a[i]. 问你有多少个连通子图,使得子图中的ma ...

  3. Codeforces Round #277 (Div. 2) D. Valid Sets 暴力

    D. Valid Sets Time Limit: 20 Sec Memory Limit: 256 MB 题目连接 http://codeforces.com/contest/486/problem ...

  4. Codeforces Round #277 (Div. 2) D. Valid Sets (DP DFS 思维)

    D. Valid Sets time limit per test 1 second memory limit per test 256 megabytes input standard input ...

  5. Codeforces Round #277 (Div. 2) D. Valid Sets DP

    D. Valid Sets   As you know, an undirected connected graph with n nodes and n - 1 edges is called a  ...

  6. Codeforces 486D D. Valid Sets

    http://codeforces.com/contest/486/problem/D 题意:给定一棵树,点上有权值,以及d,要求有多少种联通块满足最大值减最小值小于等于d. 思路:枚举i作为最大的点 ...

  7. codeforces 486 D. Valid Sets(树形dp)

    题目链接:http://codeforces.com/contest/486/problem/D 题意:给出n个点,还有n-1条边的信息,问这些点共能构成几棵满足要求的树,构成树的条件是. 1)首先这 ...

  8. Codeforces 722D. Generating Sets

    D. Generating Sets time limit per test 2 seconds memory limit per test 256 megabytes input standard ...

  9. codeforces 722D Generating Sets 【优先队列】

    You are given a set Y of n distinct positive integers y1, y2, ..., yn. Set X of n distinct positive ...

随机推荐

  1. Android开发 多媒体提取器MediaExtractor详解_将一个视频文件分离视频与音频

    前言 此篇博客讲解MediaExtractor将一个视频文件分离视频与音频,如果你对MediaExtractor还没有一个笼统的概念建议先了解我的另一篇入门博客:https://www.cnblogs ...

  2. Java集合框架(List,Set,Map)

    单列集合基本框架 List接口特点:1. 它是一个元素存取有序的集合.例如,存元素的顺序是11.22.33.那么集合中,元素的存储就是按照11.22.33的顺序完成的). 2. 它是一个带有索引的集合 ...

  3. PL/SQL创建用户

    步骤一:新建 步骤二:填写信息 对应SQL代码 -- Create the user create user WENT identified by "longrise" defau ...

  4. python模块operator对排序的辅助功能

    一.介绍 该operator模块导出一组与Python的内部运算符相对应的高效函数.例如,等同于表达式.函数名称是用于特殊类方法的函数名称; 为方便起见,还提供了没有前导和尾随的变体.operator ...

  5. C#字符串、字节数组和内存流间的相互转换 - IT浪潮之巅

    定义string变量为str,内存流变量为ms,比特数组为bt 1.字符串=>比特数组 (1)byte[] bt=System.Text.Encoding.Default.GetBytes(&q ...

  6. FTP Active & Passive

          在主动模式下,FTP客户端随机开启一个大于1024的端口N向服务器的21号端口发起连接,然后开放N+1号端口进行监听,并向服务器发出PORT N+1命令.服务器接收到命令后,会用其本地的F ...

  7. 怎么规划一个零基础学习Unity3D的“方法”或者“流程”?

    具体出处:https://www.zhihu.com/question/35542990 我只是一个计算机相关专业毕业的,已经掌握了基础的C#并开发过.net的.目前突然心血来潮对unity3D有兴趣 ...

  8. iOS开发之SceneKit框架--SCNScene.h

    1.SCNScene SCNScene是一个场景图——具有附加几何形状.光照.摄像机和其他属性的节点的层次结构,共同形成可显示的3D场景. 2.相关API简介 初始化方法 //懒加载 + (insta ...

  9. Jan&Feb 工作总结

    一.工作任务: 熟悉dcbi项目(运维经分系统),完成指定需求. 熟悉bi项目(数据分析平台),完成指定需求. steel circus 主机游戏官网制作. 一拳超人游戏预注册页wap手机端制作. 二 ...

  10. mybatis-sql语句传参

    MyBatis中的映射语句有一个parameterType属性来制定输入参数的类型.但是parameterType属性只可以写一个参数,所以如果我们想给映射语句传入多个参数的话,我们可以将所有的输入参 ...