Run ID 作者 问题 语言 测评结果 分数 时间 内存 代码长度 提交时间
52964 lgh 树上排序 C++ 运行超时 0 4000 MS 37744 KB 1561 2022-07-20 12:25:22

Tests(0/10):


#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; }


测评信息: