Advertisement
cosenza987

asdas

Jul 6th, 2023
762
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 1.30 KB | None | 0 0
  1. //Слава Україні, Героям слава
  2.  
  3. #include <bits/stdc++.h>
  4.  
  5. using namespace std;
  6.  
  7. int main() {
  8.     ios_base::sync_with_stdio(false);
  9.     cin.tie(nullptr);
  10.     int n;
  11.     cin >> n;
  12.     vector<int> v(n);
  13.     vector<vector<int>> adj(n + 1);
  14.     vector<vector<long long>> dp(2, vector<long long>(n + 1));
  15.     for(int i = 0; i < n; i++) {
  16.         cin >> v[i];
  17.     }
  18.     for(int i = 1; i < n; i++) {
  19.         int a, b;
  20.         cin >> a >> b;
  21.         adj[a].push_back(b);
  22.         adj[b].push_back(a);
  23.     }
  24.     function<void(int, int)> dfs = [&](int u, int p) {
  25.         dp[0][u] = v[0];
  26.         dp[1][u] = v[1];
  27.         vector<long long> tmp;
  28.         for(auto e : adj[u]) {
  29.             if(e != p) {
  30.                 dfs(e, u);
  31.                 dp[0][u] += dp[1][e];
  32.                 dp[1][u] += dp[1][e];
  33.                 tmp.push_back(dp[0][e] - dp[1][e]);
  34.             }
  35.         }
  36.         sort(tmp.rbegin(), tmp.rend());
  37.         long long l = dp[0][u], r = dp[1][u];
  38.         for(int i = 0; i < (int)tmp.size(); i++) {
  39.             l = l - v[i] + v[i + 1] + tmp[i];
  40.             r = r - v[i + 1] + v[i + 2] + tmp[i];
  41.             dp[0][u] = max(dp[0][u], l);
  42.             dp[1][u] = max(dp[1][u], r);
  43.         }
  44.     };
  45.     dfs(1, 0);
  46.     cout << dp[0][1] << "\n";
  47.     return 0;
  48. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement