Run ID 作者 问题 语言 测评结果 分数 时间 内存 代码长度 提交时间
52762 xhx_the_juruo 树上排序 C++ 运行超时 40 4000 MS 28028 KB 1145 2022-07-20 11:52:07

Tests(4/10):


#include<iostream> #include<cstdio> #include<queue> #define mod 1000000007 using namespace std; int n,a[500005],ans; int tot,to[1000005],nxt[1000005],lst[1000005]; int siz[500005],f[500005],vi[500005]; priority_queue<pair<int,int> >hp; int add(int x,int y){ if((x+=y)>=mod) x-=mod; return x; } void dfs(int x,int fa){ int y; siz[x]=1; f[x]=0; for(int i=lst[x];i;i=nxt[i]){ if((y=to[i])==fa) continue; dfs(y,x); siz[x]+=siz[y]; f[x]=add(f[x],f[y]); } if(vi[x]) f[x]=add(f[x],siz[x]); return; } void edge(int x,int y){ to[++tot]=y; nxt[tot]=lst[x]; lst[x]=tot; return; } int main(){ int x,y,now,cnt; scanf("%d",&n); for(int i=1;i<=n;i+=1){ scanf("%d",&a[i]); hp.push(make_pair(-a[i],i)); } for(int i=1;i<n;i+=1){ scanf("%d%d",&x,&y); edge(x,y); edge(y,x); } while(!hp.empty()){ x=hp.top().second; hp.pop(); vi[x]=1; dfs(x,0); now=1; cnt=1; for(int i=lst[x];i;i=nxt[i]){ y=to[i]; now=add(now,1ll*f[y]*(n-siz[y])%mod); now=add(now,1ll*cnt*siz[y]%mod); cnt=add(cnt,siz[y]); } ans=add(ans,1ll*now*a[x]%mod); } printf("%d\n",ans); return 0; }


测评信息: