提交时间:2022-07-20 12:05:17

运行 ID: 52870

#include <bits/stdc++.h> using namespace std; int n,ver[500005],ne[500005],head[500005],tmp[500005],u,v,tot,ans,a[500005]; const int mod=1000000007; bool visit[500005]; void add(int u,int v) { ver[++tot]=v; ne[tot]=head[u]; head[u]=tot; } void dfs(int x,int root,int cnt) { if(x==root) { memset(tmp,0,sizeof(tmp)); tmp[1]=a[root]; } visit[x]++; if(x>root) { sort(tmp+1,tmp+cnt+1); for(int i=1; i<=cnt; i++) ans=(ans+i*tmp[i])%mod; } for(int i=head[x]; i; i=ne[i]) { v=ver[i]; if(!visit[v]) { tmp[cnt+1]=a[v]; dfs(v,root,cnt+1); } } visit[x]=0; } int main() { cin>>n; for(int i=1; i<=n; i++) { cin>>a[i]; ans=(ans+a[i])%mod; } for(int i=1; i<n; i++) { cin>>u>>v; add(u,v); add(v,u); } for(int i=1; i<n; i++) dfs(i,i,1); cout<<ans%mod; }