A得十分心虚,在自己机子上跑得太慢了,而且没考虑啊a[I]=0的情况
#include<conio.h>
#include<bits/stdc++.h>
using namespace std;
#define rep(i,a,b) for(int i=a;i<=b;++i)
const int maxn=1e5+5;
struct rec
{
long long kinva;
int id;
rec(){}
rec(long long x,int y):kinva(x),id(y){}
bool operator < (const rec& a)const{return kinva>a.kinva;}
}inv[maxn];
int n;
long long k;
vector<int> tree[maxn];
int a[maxn],f[maxn],Ftree[maxn],ask[maxn];
inline int lowbit(int x)
{
return x&(-x);
}
void add(int i,int k)
{
while(i<maxn){Ftree[i]+=k;i+=lowbit(i);}
}
int sum(int i)
{
int ret=0;
while(i){ret+=Ftree[i];i-=lowbit(i);}
return ret;
}
int ans;
void dfs(int p,int u)
{
ans+=sum(ask[u]);
add(f[u],1);
int sz=tree[u].size();
for(int i=0;i<sz;++i)
{
if(tree[u][i]==p)continue;
dfs(u,tree[u][i]);
}
add(f[u],-1);
//printf("%d->%d,ask[%d]=%d,ans=%d
",p,u,u,ask[u],ans);
}
int main()
{
//freopen("Input.txt","r",stdin);
int T;scanf("%d",&T);
while(T--)
{
memset(Ftree,0,sizeof Ftree);for(int i=1;i<=n;++i)tree[i].clear();
scanf("%d%lld",&n,&k);
for(int i=1;i<=n;++i){scanf("%d",a+i);inv[i]=rec(k/a[i],i);}
sort(inv+1,inv+n+1);
for(int i=1;i<=n;++i)f[inv[i].id]=i;
for(int i=1,j=n;j>0;j--){while(i<=n&&a[inv[j].id]<=inv[i].kinva)i++;ask[inv[j].id]=i-1;}
int root,note[maxn];memset(note,0,sizeof note);
for(int i=1;i<n;++i){int u,v;scanf("%d%d",&u,&v);tree[u].push_back(v);tree[v].push_back(u);note[v]=1;}
for(root=1;note[root];root++);
ans=0;dfs(0,root);
printf("%d
",ans);
}
}