提交时间:2022-07-20 11:52:07
运行 ID: 52762
#include<iostream> #include<cstdio> #include<queue> #define mod 1000000007 using namespace std; int n,a[500005],ans; int tot,to[1000005],nxt[1000005],lst[1000005]; int siz[500005],f[500005],vi[500005]; priority_queue<pair<int,int> >hp; int add(int x,int y){ if((x+=y)>=mod) x-=mod; return x; } void dfs(int x,int fa){ int y; siz[x]=1; f[x]=0; for(int i=lst[x];i;i=nxt[i]){ if((y=to[i])==fa) continue; dfs(y,x); siz[x]+=siz[y]; f[x]=add(f[x],f[y]); } if(vi[x]) f[x]=add(f[x],siz[x]); return; } void edge(int x,int y){ to[++tot]=y; nxt[tot]=lst[x]; lst[x]=tot; return; } int main(){ int x,y,now,cnt; scanf("%d",&n); for(int i=1;i<=n;i+=1){ scanf("%d",&a[i]); hp.push(make_pair(-a[i],i)); } for(int i=1;i<n;i+=1){ scanf("%d%d",&x,&y); edge(x,y); edge(y,x); } while(!hp.empty()){ x=hp.top().second; hp.pop(); vi[x]=1; dfs(x,0); now=1; cnt=1; for(int i=lst[x];i;i=nxt[i]){ y=to[i]; now=add(now,1ll*f[y]*(n-siz[y])%mod); now=add(now,1ll*cnt*siz[y]%mod); cnt=add(cnt,siz[y]); } ans=add(ans,1ll*now*a[x]%mod); } printf("%d\n",ans); return 0; }