Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <bits/stdc++.h>
- using namespace std;
- #define mp make_pair
- #define fr first
- #define sc second
- #define pb push_back
- vector<pair<long long,long long> > adjlist[500005];
- long long pop[500005],sz[500005],dst[500005],ans[500005],zero,tot;
- bool v[500005],vs[500005],va[500005];
- void dfs(long long node, long long dist) {
- if (v[node]) return;
- v[node] = true;
- zero += (dist * pop[node]);
- dst[node] = dist;
- for (auto it : adjlist[node])
- dfs(it.fr, dist+it.sc);
- }
- void subtree(long long node) {
- if (vs[node]) return;
- vs[node] = true;
- long long tmp = 0;
- for (auto it : adjlist[node])
- if (it.fr != node) {
- subtree(it.fr);
- tmp += sz[it.fr];
- }
- sz[node] = pop[node] + tmp;
- return;
- }
- void dfs2(long long node, long long prev) {
- if (va[node]) return;
- va[node] = true;
- if (prev != -1)
- ans[node] = ans[prev] - dst[node]*sz[node] + dst[node]*(tot-sz[node]);
- for (auto it : adjlist[node])
- dfs2(it.fr, node);
- }
- int main() {
- //freopen("input.txt","r",stdin);
- ios::sync_with_stdio(0);
- cin.tie(0);
- cout.tie(0);
- long long n,x,y,c;
- cin >> n;
- for (int i=0; i<n; i++) {
- cin >> pop[i];
- tot += pop[i];
- }
- for (int i=0; i<n-1; i++) {
- cin >> x >> y >> c;
- adjlist[x].pb(mp(y,c));
- adjlist[y].pb(mp(x,c));
- }
- dfs(0,0);
- subtree(0);
- ans[0] = zero;
- dfs2(0,-1);
- for (int i=0; i<n; i++) {
- if (i) cout << " ";
- cout << ans[i];
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement