提交时间:2022-07-20 11:52:18
运行 ID: 52766
#include <bits/stdc++.h> using namespace std; const int Maxn=5e5; const int Mod=1e9+7; struct Node { int v,next; } T[Maxn<<1]; int H[Maxn],seq[Maxn]; struct XDT { int sum,ls,rs; } X[Maxn<<2]; int n,cnt,p,ans; int w[Maxn],mn[Maxn],id[Maxn],top[Maxn],dep[Maxn]; int fa[Maxn],son[Maxn],size[Maxn],I[Maxn]; inline void Add(int x,int y) { T[++p]=Node {y,H[x]}; H[x]=p; } //inline void B(int l,int r,int pos) //{ // X[pos].ls=l,X[pos].rs=r; // if(l==r) // { // X[pos].sum=wn[l]; // return ; // } // int mid=(l+r)>>1; // B(l,mid,pos<<1),B(mid+1,r,pos<<1|1); // X[pos].sum=(X[pos<<1].sum+X[pos<<1|1].sum)%Mod; //} //inline int Q(int l,int r,int pos) //{ // if(l<=X[pos].ls && X[pos].rs<=r) // return X[pos].sum%Mod; // int mid=(X[pos].ls+X[pos].rs)>>1,ans=0; // if(l<=mid) ans+=Q(l,r,pos<<1)%Mod; // if(mid<r) ans+=Q(l,r,pos<<1|1)%Mod; // return ans%Mod; //} inline void Search1(int x,int f,int depth) { fa[x]=f,dep[x]=depth,size[x]=1; int hson=-1; for(int i=H[x]; i; i=T[i].next) { int rec=T[i].v; if(rec==f) continue; Search1(rec,x,depth+1); size[x]+=size[rec]; if(size[rec]>hson) hson=size[rec],son[x]=rec; } } //inline void Search2(int x,int tp) //{ // top[x]=tp,id[x]=++cnt,wn[cnt]=w[x],I[id[x]]; // if(!son[x]) return ; // Search2(son[x],tp); // for(int i=H[x]; i; i=T[i].next) // { // int rec=T[i].v; // if(rec==fa[x] || rec==son[x]) // continue; // Search2(rec,rec); // } //} //inline int Qpath(int x,int y) //{ // int ans=0; // while(top[x]!=top[y]) // { // if(dep[top[x]]<dep[top[y]]) swap(x,y); // ans+=Q(id[top[x]],id[x],1)%Mod; // x=fa[top[x]]; // } // if(dep[x]>dep[y]) swap(x,y); // ans+=Q(id[x],id[y],1)%Mod; // return ans; //} inline int Search(int x,int y,int f) { if(x==y) { int sum=0; for(int i=1; i<=cnt; i++) sum+=seq[i]; return sum; } for(int i=H[x]; i; i=T[i].next) { int rec=T[i].v; if(rec==f) continue; seq[++cnt]=w[rec]*cnt%Mod; Search(rec,y,x); } } int main() { ios::sync_with_stdio(false); cin.tie(0),cout.tie(0); cin>>n; for(int i=1; i<=n; i++) cin>>w[i]; for(int i=1,x,y; i<=n-1; i++) { cin>>x>>y; Add(x,y),Add(y,x); } for(int i=1; i<=n; i++) for(int j=i; j<=n; j++) { seq[++cnt]=w[i]; ans+=Search(i,j,i)%Mod; memset(seq,0,sizeof(seq)); cnt=0; } cout<<ans<<'\n'; return 0; }