voiddfs(int u,int fa){ for (int k=1;k<=max_cnt;k++) dp[u][k]=k*a[u]; for (int v: G[u]) if (v!=fa){ dfs(v,u); for (int k=1;k<=max_cnt;k++){ ll delta=inf; for (int j=1;j<=max_cnt;j++) if (k!=j) delta=min(delta,dp[v][j]); dp[u][k]+=delta; } } }
voidsolve(void){ cin>>n; max_cnt=(int)log2(n)+1; memset(dp,127,sizeof(dp)); for (int i=1;i<=n;i++) G[i].clear(); for (int i=1;i<=n;i++) cin>>a[i]; for (int i=1,u,v;i<n;i++){ cin>>u>>v; G[u].push_back(v); G[v].push_back(u); } dfs(1,0); ll ans=inf; for (int k=1;k<=max_cnt;k++) ans=min(ans,dp[1][k]); cout<<ans<<endl; }
voiddfs(int u,int fa){ for (int k=1;k<=max_cnt;k++) dp[u][k]=k*a[u]; for (int v: G[u]) if (v!=fa){ dfs(v,u); ll minn=inf,min2=inf; int pos; for (int k=1;k<=max_cnt;k++) if (dp[v][k]<minn) min2=minn,minn=dp[v][k],pos=k; elseif (dp[v][k]<min2) min2=dp[v][k]; for (int k=1;k<=max_cnt;k++) dp[u][k]+=(k!=pos)?minn:min2; } }
voidsolve(void){ cin>>n; max_cnt=(int)log2(n)+1; for (int i=1;i<=n;i++) for (int k=1;k<=max_cnt;k++) dp[i][k]=inf; for (int i=1;i<=n;i++) G[i].clear(); for (int i=1;i<=n;i++) cin>>a[i]; for (int i=1,u,v;i<n;i++){ cin>>u>>v; G[u].push_back(v); G[v].push_back(u); } dfs(1,0); ll ans=inf; for (int k=1;k<=max_cnt;k++) ans=min(ans,dp[1][k]); cout<<ans<<endl; }