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 }
View Code

相关文章:

  • 2021-11-26
  • 2021-06-18
  • 2022-12-23
  • 2022-12-23
  • 2022-12-23
  • 2022-12-23
  • 2021-12-28
  • 2021-05-17
猜你喜欢
  • 2021-10-30
  • 2021-12-12
  • 2021-12-06
  • 2022-12-23
  • 2022-12-23
  • 2021-07-29
相关资源
相似解决方案