1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108
| #include<stdio.h> #include<algorithm> #include<string.h> #include<math.h> #include<vector> #include<map> using namespace std; map<long long ,long long> f1,f2; struct node { long long x; int id; }; long long k; int n; node a1[100005]; int a[200005]; long long id[200005]; int idf[100005]; int cnt[100005]; vector<int> g[100005]; long long sum; int cmp(node a,node b) { return a.x<b.x; } int lowbit(int x) { return x&-x; } long long getsum(int x) { long long sum=0; for(int i=x;i>0;i-=lowbit(i)) sum+=a[i]; return sum; } void add(int x,int b) { for(int i=x;i<=n;i+=lowbit(i)) a[i]+=b; } void dfs(int s) { long long kk=k/f2[s]; int pos=upper_bound(id+1,id+1+n,kk)-id; if(pos>n)pos--; while(id[pos]>kk)pos--; sum+=getsum(pos); add(idf[s],1); for(int i=0;i<g[s].size();i++) { int v=g[s][i]; dfs(v); } add(idf[s],-1); } int main() { int t; int i,j,m; scanf("%d",&t); while(t--) { f1.clear(); f2.clear(); sum=0; memset(a,0,sizeof(a)); memset(a1,0,sizeof(a1)); memset(cnt,0,sizeof(cnt)); scanf("%d%lld",&n,&k); for(int i=1;i<=n;i++)g[i].clear(); for(int i=1;i<=n;i++) {scanf("%lld",&a1[i].x); a1[i].id=i; f2[i]=a1[i].x; } sort(a1+1,a1+1+n,cmp); for(int i=1;i<=n;i++) { id[i]=a1[i].x; f1[a1[i].x]=i; idf[a1[i].id]=i; } for(int i=1;i<=n-1;i++) { int u,v; scanf("%d%d",&u,&v); g[u].push_back(v); cnt[v]=1; } for(int i=1;i<=n;i++) if(cnt[i]==0) { dfs(i); break; } printf("%lld\n",sum); } return 0; }
|