8题。B有傻逼做法但是没出来,不应该。反而最后搞出G出乎意料,lzhnb!
A:
solver:lzh
1 #include <bits/stdc++.h> 2 using namespace std; 3 typedef pair<int, int> pii; 4 typedef long long ll; 5 #define ff first 6 #define ss second 7 #define mp make_pair 8 9 ll dp1[100010], dp2[100010], ans[100010]; 10 int t[100010], sz[100010], sumt[100010], n, T; 11 vector<pii> v[100010]; 12 void dfs0(int x, int pre) { 13 for (auto i : v[x]) 14 if (i.ff != pre) { 15 dfs0(i.ff, x); 16 sz[x] += sz[i.ff]; 17 sumt[x] += sumt[i.ff]; 18 dp1[x] += 1ll * sz[i.ff] * i.ss + dp1[i.ff]; 19 dp2[x] += 1ll * sumt[i.ff] * i.ss + dp2[i.ff]; 20 } 21 sumt[x] += t[x]; 22 sz[x]++; 23 } 24 void dfs(int x, int pre) { 25 ans[x] = 1ll * t[x] * dp1[x] + dp2[x]; 26 for (auto i : v[x]) 27 if (i.ff != pre) { 28 dp1[i.ff] = dp1[x] + 1ll * i.ss * (n - sz[i.ff]) - 1ll * sz[i.ff] * i.ss; 29 dp2[i.ff] = dp2[x] + 1ll * (T - sumt[i.ff]) * i.ss - 1ll * sumt[i.ff] * i.ss; 30 dfs(i.ff, x); 31 } 32 } 33 int main() { 34 scanf("%d", &n); 35 T = 0; 36 for (int i = 1; i <= n; i++) 37 scanf("%d", &t[i]), T += t[i]; 38 for (int i = 1; i <= n - 1; i++) { 39 int x, y, z; 40 scanf("%d%d%d", &x, &y, &z); 41 v[x].push_back(mp(y, z)); 42 v[y].push_back(mp(x, z)); 43 } 44 dfs0(1, -1); 45 dfs(1, -1); 46 for (int i = 1; i <= n; i++) 47 printf("%lld\n", ans[i]); 48 }