#include <iostream>
#include <cstdio>
#include <vector>
#include <cmath>
#include <string>
#include <string.h>
#include <algorithm>
using namespace std;
#define LL __int64
#define eps 1e-8
#define lson l , m , rt << 1
#define rson m + 1 , r , rt << 1 | 1
#define MAXN 400020
#define clr(x) memset(x,0,sizeof(x))
#define clr2(x) memset(x,INF,sizeof(x))
#define clr3(x) memset(x,-INF,sizeof(x))
#define clr4(x) memset(x,-1,sizeof(x))
const int maxn = 400000 + 5;
struct Node {
LL h;
int pos;
bool operator < (const Node tmp) const {
return h < tmp.h;
}
} a[maxn];
struct Section {
int L , R ;
LL H;
int index;
bool operator < (const Section tmp) const {
return H < tmp.H;
}
} s[maxn];
int cnt[maxn << 2] , ans[maxn];
void PushUp(int rt)
{
cnt[rt] = cnt[rt << 1] + cnt[rt << 1 | 1];
}
void build()
{
memset(cnt , 0 , sizeof(cnt));
}
void update(int p , int l , int r , int rt)
{
if(l == r) {
cnt[rt]++;
return;
}
int m = (l + r) >> 1;
if(p > m)
update(p , rson);
else
update(p , lson);
PushUp(rt);
}
int query(int L , int R , int l , int r , int rt)
{
if(L <= l && R >= r) {
return cnt[rt];
}
int m = (l + r) >> 1;
if(L > m)
return query(L , R , rson);
else if(R <= m)
return query(L , R , lson);
else
return query(L , R , lson) + query(L , R , rson);
}
struct Edge
{
int to,next;
}edge[MAXN];
int head[MAXN],cnte;
int in[MAXN],out[MAXN],t;
void init()
{
clr(edge);
memset(head,-1,sizeof(head));
clr(in);
clr(out);
cnte=0;
}
void add(int u,int v)
{
edge[cnte].to=v;
edge[cnte].next=head[u];
head[u]=cnte++;
}
void dfs(int u)
{
in[u]=++t;
for (int i=head[u];~i;i=edge[i].next)
{
int v=edge[i].to;
dfs(v);
}
out[u]=t;
}
LL tark;
int deg[MAXN];
LL b[MAXN];
int main()
{
int T , i , j , n , m;
cin >> T;
for(int k = 1 ; k <= T ; k++)
{
build();
scanf("%d%I64d",&n,&tark);
for(i = 1 ; i <= n ; i++) {
scanf("%d" , &b[i]);
}
init();
clr(deg);
int u,v;
for (int i=1;i<n;i++)
{
scanf("%d%d",&u,&v);
add(u,v);
deg[v]++;
}
int st;
for (int i=1;i<=n;i++)
if (deg[i]==0)
{
st=i;
break;
}
t=0;
dfs(st);
m=n;
for(i = 1 ; i <= n ; i++)
{
s[i].L=in[i];
s[i].R=out[i];
a[in[i]].h=b[i];
a[in[i]].pos=in[i];
if (b[i]!=0)
s[i].H=tark / b[i];
else
s[i].H=1e9+233;
s[i].index = i;
}
sort(a + 1 , a + n + 1);
sort(s + 1 , s + m + 1);
for(i = j = 1 ; i <= m ; i++) {
while(a[j].h <= s[i].H && j <= n) {
update(a[j++].pos , 1 , n , 1);
}
if (s[i].L+1 <= s[i].R)
ans[s[i].index] = query(s[i].L + 1 , s[i].R , 1 , n , 1);
else
ans[s[i].index] = 0;
}
long long sum = 0;
for(i = 1 ; i <= m ; i++)
sum+=ans[i];
cout<<sum<<endl;
}
return 0;
}
hdu 5877
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.