提交时间:2022-07-20 11:58:11

运行 ID: 52793

#include <cstdio> using namespace std; int n,qt,cnt; const long long md=1e9+7; int q[200005]; struct rd{ int y; int nxt; }; rd a[2000005]; int h[200005]; int f[200005]; int sz[200005]; int dfn[200005]; int ds[200005]; long long ans,rks; void addd(int ax,int ay){ a[++qt].y=ay; a[qt].nxt=h[ax]; h[ax]=qt; } void dft(int u,int fa,int s,int ax){ rks=(rks+s*ax)%md; int i,v; for(i=h[u];i!=0;i=a[i].nxt){ v=a[i].y; if(v==fa) continue; if(q[v]>s) dft(v,u,s,ax); else dft(v,u,s,ax+1); } } int main(){ scanf("%d",&n); int i,ax,ay,j; for(i=1;i<=n;i++){ scanf("%d",&q[i]); } for(i=1;i<n;i++){ scanf("%d%d",&ax,&ay); addd(ax,ay); addd(ay,ax); } for(i=1;i<=n;i++){ rks=0; dft(i,0,q[i],1); ans+=rks; } printf("%lld\n",ans); return 0; }