Advertisement
BaoJIaoPisu

Untitled

Nov 4th, 2022
627
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.82 KB | None | 0 0
  1. #include<bits/stdc++.h>
  2.  
  3. using namespace std;
  4.  
  5. using ll = long long;
  6. using ld = long double;
  7. using ull = unsigned long long;
  8.  
  9. using pii = pair<int, int>;
  10. using pll = pair<ll, ll>;
  11. using pld = pair<ld, ld>;
  12.  
  13. #define fi first
  14. #define se second
  15. #define pb push_back
  16. #define pf push_front
  17. #define mp make_pair
  18. #define ins insert
  19. #define btpc __builtin_popcount
  20. #define btclz __builtin_clz
  21.  
  22. #define sz(x) (int)(x.size());
  23. #define all(x) x.begin(), x.end()
  24. #define debug(...) " [" << #__VA_ARGS__ ": " << (__VA_ARGS__) << "] "
  25.  
  26. mt19937 rng(chrono::steady_clock::now().time_since_epoch().count());
  27.  
  28. int d4x[4] = {1, 0, -1, 0}; int d4y[4] = {0, 1, 0, -1};
  29. int d8x[8] = {0, 1, 1, 1, 0, -1, -1, -1};
  30. int d8y[8] = {1, 1, 0, -1, -1, -1, 0, 1};
  31.  
  32. template<class X, class Y>
  33.     bool minimize(X &x, const Y &y) {
  34.         if (x > y)
  35.         {
  36.             x = y;
  37.             return true;
  38.         }
  39.         return false;
  40.     }
  41. template<class X, class Y>
  42.     bool maximize(X &x, const Y &y) {
  43.         if (x < y)
  44.         {
  45.             x = y;
  46.             return true;
  47.         }
  48.         return false;
  49.     }
  50.  
  51. const int MOD = 1e9 + 7; //998244353
  52.  
  53. template<class X, class Y>
  54.     void add(X &x, const Y &y) {
  55.         x = (x + y);
  56.         if(x >= MOD) x -= MOD;
  57.     }
  58.  
  59. template<class X, class Y>
  60.     void sub(X &x, const Y &y) {
  61.         x = (x - y);
  62.         if(x < 0) x += MOD;
  63.     }
  64.  
  65. /* Author : Le Ngoc Bao Anh, 12A5, LQD High School for Gifted Student*/
  66.  
  67. const ll INF = 1e9;
  68. const int N = 1e5 + 10;
  69.  
  70. struct Edges {
  71.     int u, v, w;
  72. } ed[N];
  73.  
  74. int par[N];
  75. ll dp[N];
  76. int w[N];
  77.  
  78. int find_par(int u) {
  79.     if(par[u] < 0) return u;
  80.     return find_par(par[u]);
  81. }
  82.  
  83. void merge(int u, int v, int we) {
  84.     u = find_par(u), v = find_par(v);
  85.     if(par[u] > par[v]) swap(u, v);
  86.     dp[u] += we * -par[v];
  87.     dp[v] += we * -par[u];
  88.     dp[v] -= dp[u];
  89.  
  90.     par[u] += par[v];
  91.     par[v] = u;
  92. }
  93.  
  94. ll get_ans(int u, int w) {
  95.     return dp[u] + (par[u] > 0 ? get_ans(par[u], w) : 0);
  96. }
  97.  
  98. void solve() {
  99.     int n; cin >> n;
  100.  
  101.     for(int i = 1; i < n; i++) {
  102.         int u, v;
  103.         u = i + 1; cin >> v;
  104.         ed[i] = {u, v, 0};
  105.     }
  106.  
  107.     for(int i = 1; i <= n; i++) par[i] = -1;
  108.     for(int i = 1; i <= n; i++) cin >> w[i];
  109.     for(int i = 1; i < n; i++) {
  110.         ed[i].w = min(w[ed[i].u], w[ed[i].v]);     
  111.     }
  112.  
  113.     sort(ed + 1, ed + n, [&](Edges _x, Edges _y) {
  114.         return _x.w > _y.w;
  115.     });
  116.  
  117.     for(int i = 1; i < n; i++) {
  118.         merge(ed[i].u, ed[i].v, ed[i].w);
  119.     };
  120.  
  121.     for(int i = 1; i <= n; i++) {
  122.         cout << w[i] + get_ans(i, w[i]) << " ";
  123.     }
  124. }
  125.  
  126. int main()
  127. {
  128.     ios_base::sync_with_stdio(0); cin.tie(0); cout.tie(0);
  129.     #ifndef ONLINE_JUDGE
  130.     freopen("input.txt", "r", stdin);
  131.     freopen("output.txt", "w", stdout);
  132.     #else
  133.     //online
  134.     #endif
  135.  
  136.     int tc = 1, ddd = 0;
  137.     // cin >> tc;
  138.     while(tc--) {
  139.         //ddd++;
  140.         //cout << "Case #" << ddd << ": ";
  141.         solve();
  142.     }
  143. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement