提交时间:2022-07-20 11:55:45
运行 ID: 52786
//40pts #include <bits/stdc++.h> #define ll long long using namespace std; const int maxn=5e5+5; ll A[maxn],C[maxn],val[maxn]; ll a[maxn],b[maxn]; int cnt; const int mod=1e9+7; int n; ll qpow(ll a,ll b){ ll ret=1;while(b){ if(b&1) ret=ret*a%mod; a=a*a%mod;b>>=1; }return ret; } struct node{ int v,nxt; }edge[maxn<<1];int head[maxn],cntE; void add(int u,int v){ edge[++cntE]=(node){v,head[u]}; head[u]=cntE; } void update(int x,ll k,ll *C){ while(x<=n){ C[x]=(C[x]+k+mod)%mod;x+=-x&x; } } ll query(int x,ll *C){ ll ret=0;while(x){ ret=(ret+C[x]+mod)%mod;x-=-x&x; }return ret; } ll ans=0; void dfs(int u,int p,ll ret){ ll rnk=query(b[u],A)+1; ll sum=(query(n,C)-query(b[u],C)+mod)%mod; ret=(ret+sum+rnk*a[u])%mod; if(u==p) ans=(ans+2*ret)%mod; else ans=(ans+ret)%mod; update(b[u],1,A),update(b[u],a[u],C); for(int i=head[u];i;i=edge[i].nxt){ int v=edge[i].v;if(v==p) continue; dfs(v,u,ret); } update(b[u],-1,A),update(b[u],-a[u],C); } int main(){ scanf("%d",&n); for(int i=1;i<=n;i++){ scanf("%d",&a[i]);val[++cnt]=a[i]; } for(int i=1;i<=n-1;i++){ int u,v;scanf("%d%d",&u,&v); add(u,v);add(v,u); } sort(val+1,val+cnt+1); int m=unique(val+1,val+cnt+1)-val-1; for(int i=1;i<=n;i++){ b[i]=lower_bound(val+1,val+m+1,a[i])-val; } for(int u=1;u<=n;u++){ dfs(u,u,0); } printf("%lld",ans*qpow(2,mod-2)%mod); }