标签:
Time Limit: 4000/2000 MS (Java/Others) Memory Limit: 262144/262144 K (Java/Others)
Total Submission(s): 2081 Accepted Submission(s): 643
#include <cstdio> #include <vector> #include <cstring> #include <algorithm> using namespace std; typedef long long LL; const int MAXN=100005; int n; LL k; vector<int> arc[MAXN]; LL val[MAXN]; LL buf[MAXN+MAXN]; int top; int deg[MAXN]; int bit[MAXN+MAXN]; void add(int i,int x) { int limit=MAXN+MAXN; while(i<limit) { bit[i]+=x; i+=(i&(-i)); } } int sum(int i) { int s=0; while(i>0) { s+=bit[i]; i-=(i&(-i)); } return s; } int vis[MAXN]; LL res; void dfs(int u) { vis[u]=1; int has1=lower_bound(buf,buf+top,k/val[u])-buf+1; int s=sum(has1); for(int i=0;i<arc[u].size();i++) { int to=arc[u][i]; if(!vis[to]) { dfs(to); } } res+=(sum(has1)-s); int has2=lower_bound(buf,buf+top,val[u])-buf+1; add(has2,1); } int main() { int T; scanf("%d",&T); while(T--) { res=0; memset(vis,0,sizeof(vis)); memset(bit,0,sizeof(bit)); top=0; memset(deg,0,sizeof(deg)); scanf("%d%lld",&n,&k); for(int i=1;i<=n;i++) { arc[i].clear(); scanf("%lld",&val[i]); } for(int i=0;i<n-1;i++) { int u,v; scanf("%d%d",&u,&v); arc[u].push_back(v); arc[v].push_back(u); deg[v]++; } for(int i=1;i<=n;i++) { buf[top++]=val[i]; } for(int i=1;i<=n;i++) { buf[top++]=k/val[i]; } sort(buf,buf+top); for(int i=1;i<=n;i++) { if(deg[i]==0) { dfs(i); break; } } printf("%lld\n",res); } return 0; }
标签:
原文地址:http://www.cnblogs.com/program-ccc/p/5874451.html