设dp[x]为从root到x的总类数
枚举root,使其在序列中保持最大
其中可能出现重复,去重即可
#include<bits/stdc++.h>
using namespace std;
#define int long long
const int mod=1000000007;
const int N=1e5+10;
const int MAXN=2e3+10;
struct node{
int to,nxt;
}d[N];int head[N],tot=0;
void add(int a,int b){
d[++tot]={b,head[a]};head[a]=tot;
}
int dis,n,a[N],dp[N];
int ans=0;
int vis[MAXN][MAXN];
void dfs(int x,int fa,int id){
dp[x]=1;
for(int i=head[x];i;i=d[i].nxt){
int to=d[i].to;
if(to!=fa&&((a[to]<a[id]||(to<id&&a[to]==a[id]))&&a[id]-a[to]<=dis)){
dfs(to,x,id);
dp[x]=(dp[x]+dp[to]*dp[x])%mod;
}
}
}
int32_t main(){
scanf("%lld%lld",&dis,&n);
for(int i=1;i<=n;i++) scanf("%lld",&a[i]);
for(int i=1;i<n;i++){
int x,y;scanf("%lld%lld",&x,&y);
add(x,y);add(y,x);
}
int ans=0;
for(int i=1;i<=n;i++){
dfs(i,0,i);
ans=(ans+dp[i])%mod;
}
cout<<ans<<endl;
}