2020牛客多校第九場By Rynar
阿新 • • 發佈:2020-08-08
B.Groundhog and Apple Tree
心態大崩,賽時一句話寫錯,賽後一A,我好菜
typedef long long ll; const int N=1e5+10; #define int ll typedef pair<int,int> pii; int n,m; int a[N]; vector<pii>v[N]; int dp[N][2]; void dfs(int x,int fa){ dp[x][1]=a[x]; priority_queue <pii,vector<pii>,greater<pii> > q; priority_queue <pii>q1; for (pii i:v[x]){ if (i.first==fa)continue; dfs(i.first,x); dp[i.first][1]-=2*i.second; dp[i.first][0]+=i.second; dp[x][1]+=dp[i.first][1]; if (dp[i.first][1]>=0){ q.push({dp[i.first][0],dp[i.first][1]}); } else{ q1.push({dp[i.first][0]+dp[i.first][1],dp[i.first][0]}); } } int r=a[x]; int o=0; while (!q.empty()){ pii t=q.top();q.pop(); if (r<t.first)o+=t.first-r,r=t.first; r+=t.second; } while (!q1.empty()){ pii t=q1.top();q1.pop(); int e=t.first-t.second; if (r<t.second)o+=t.second-r,r=t.second; r+=e; } dp[x][0]=max(o,-dp[x][1]); } signed main(){ int T,x,y,z; scanf("%lld",&T); while (T--){ scanf("%lld",&n); for (int i=1;i<=n;i++){ scanf("%lld",&a[i]); v[i].clear(); } for (int i=1;i<n;i++){ scanf("%lld%lld%lld",&x,&y,&z); v[x].push_back({y,z});v[y].push_back({x,z}); } dfs(1,0); printf("%lld\n",dp[1][0]); } return 0; }