提交时间:2022-07-20 11:52:55
运行 ID: 52773
#include<bits/stdc++.h> #define il inline using namespace std; const int mod=1e9+7; const int maxn=500010; const int N=maxn<<2; il int read(){ int x=0; char c=getchar(); for(;!(c>='0'&&c<='9');c=getchar()); for(;c>='0'&&c<='9';c=getchar()) x=(x<<1)+(x<<3)+c-'0'; return x; } struct edge{ int v,to; }e[maxn<<1]; int f[maxn],Tap[maxn]; int a[maxn],ans,val1,val2; int n; int head[maxn],ecnt; void addedge(int u,int v){ e[++ecnt].v=v,e[ecnt].to=head[u],head[u]=ecnt; } void update(int &x,int y){if((x+=y)>=mod)x-=mod;} void dfs(int fa,int x,int rt){ if(a[x]<a[rt]) f[x]++; update(ans,(f[x]+1)*1ll*a[rt]%mod); update(ans,val1*1ll*a[rt]%mod); update(ans,val2*1ll*a[rt]%mod); update(ans,val1*1ll*f[x]%mod*a[rt]%mod); for(int i=head[x];i;i=e[i].to) if(e[i].v^fa) f[e[i].v]=f[x],dfs(x,e[i].v,rt); } void DFS(int fa,int x){ val2+=f[x],val1++,Tap[f[x]]++; for(int i=head[x];i;i=e[i].to) if(e[i].v^fa) DFS(x,e[i].v); } void clear(int fa,int x){ Tap[f[x]]--,f[x]=0; for(int i=head[x];i;i=e[i].to) if(e[i].v^fa) clear(x,e[i].v); } int main(){ n=read();int x,y; for(int i=1;i<=n;i++) a[i]=read(); for(int i=1;i<n;i++){ x=read(),y=read(); addedge(x,y),addedge(y,x); } for(int i=1;i<=n;i++){ val1=val2=0; for(int j=head[i];j;j=e[j].to){ dfs(i,e[j].v,i),DFS(i,e[j].v); }update(ans,a[i]); clear(0,i); } printf("%d\n",ans); return 0; }