Run ID | 作者 | 问题 | 语言 | 测评结果 | 分数 | 时间 | 内存 | 代码长度 | 提交时间 |
---|---|---|---|---|---|---|---|---|---|
52964 | lgh | 树上排序 | C++ | 运行超时 | 0 | 4000 MS | 37744 KB | 1561 | 2022-07-20 12:25:22 |
#include <bits/stdc++.h> using namespace std; typedef long long ll; const ll mod=1e9+7; vector<int>e[500010]; template<typename T> inline void Read(T &x) { x=0; char ch(getchar()); while(!isdigit(ch)) ch=getchar(); while(isdigit(ch)) x=(x<<3)+(x<<1)+(ch^48),ch=getchar(); } ll n,ans,a[500010]; ll vis[1000010],cnt; void dfs(int i) { vis[++cnt]=i; if(e[i].empty()) return ; for(int j=0; j<e[i].size(); j++) dfs(e[i][j]),vis[++cnt]=i; return ; } ll calc(ll u, ll v) { if(u==v) return a[u]; ll num=0,fu=-1,fv=-1,flag1=1,flag2=1,fu2,x=0; for(int i=1; i<=cnt; i++) { if(vis[i]==u &&fv==-1) fu=i; if(flag2 &&vis[i]==v) fv=i,flag2=0; if(vis[i]==u && fv!=-1 && i<=cnt && flag1) fu2=i,flag1=0; } if(abs(fu2-fv)<abs(fv-fu)) fu=fv,fv=fu2; set<ll>s; //vis数组 // cout<<fu<<' '<<fv<<endl; if(fu>fv) swap(fu,fv); // cout<<"vis: "; // for(int i=fu; i<=fv; i++) cout<<vis[i]<<' '; // puts(""); for(int i=fu; i<=fv; i++) s.insert(a[vis[i]]); for(set<ll>::iterator ii=s.begin(); ii!=s.end(); ii++) num=(num+(*ii)*(++x))%mod; // cout<<u<<' '<<v<<' '<<num<<endl; return num; } int main() { Read(n); for(int i=1; i<=n; i++) Read(a[i]); for(int i=1,x,y; i<n; i++) { Read(x),Read(y); e[x].push_back(y); } for(int i=1; i<n; i++) sort(e[i].begin(),e[i].end()); dfs(1); // for(int i=1; i<=cnt; i++) cout<<vis[i]<<endl; // cout<<calc(4,5); for(int i=1; i<=n; i++) for(int j=i; j<=n; j++) ans+=calc(i,j); cout<<ans<<endl; // return 0; }