提交时间:2022-07-20 11:53:43

运行 ID: 52780

#include<bits/stdc++.h> #define mod 1000000007 #define ll long long #define N 500005 using namespace std; vector <int> t[N]; int n,val[N],dep[N],fa[N][30]; ll a[N],ans;int cnt; void dfs(int k,int f){ dep[k]=dep[f]+1;fa[k][0]=f; for(int i(1);i<=25;++i) fa[k][i]=fa[fa[k][i-1]][i-1]; for(int i(0);i<t[k].size();++i) if(t[k][i]^f) dfs(t[k][i],k); } inline int LCA(int x,int y){ if(x==y) return x; if(dep[x]<dep[y]) swap(x,y); for(int i(25);~i;--i) if(dep[fa[x][i]]>=dep[y]) x=fa[x][i]; if(x==y) return x; for(int i(25);~i;--i) if(fa[x][i]^fa[y][i]){ x=fa[x][i]; y=fa[y][i]; } return fa[x][0]; } int main(){ scanf("%d",&n); for(int i(1);i<=n;++i) scanf("%d",val+i); for(int i(1),u,v;i<n;++i){ scanf("%d%d",&u,&v); t[u].push_back(v); t[v].push_back(u); } dfs(1,0); for(int i(1);i<=n;++i) for(int j(i);j<=n;++j){ int lca(LCA(i,j));cnt=0; for(int x(i);x^lca;x=fa[x][0]) a[++cnt]=val[x]; for(int y(j);y^lca;y=fa[y][0]) a[++cnt]=val[y]; a[++cnt]=val[lca];sort(a+1,a+1+cnt); for(int k(1);k<=cnt;++k) (ans+=k*a[k]%mod)%=mod; } printf("%lld\n",ans); return 0; }