Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- //Слава Україні, Героям слава
- #include <bits/stdc++.h>
- using namespace std;
- int main() {
- ios_base::sync_with_stdio(false);
- cin.tie(nullptr);
- int n;
- cin >> n;
- vector<int> v(n);
- vector<vector<int>> adj(n + 1);
- vector<vector<long long>> dp(2, vector<long long>(n + 1));
- for(int i = 0; i < n; i++) {
- cin >> v[i];
- }
- for(int i = 1; i < n; i++) {
- int a, b;
- cin >> a >> b;
- adj[a].push_back(b);
- adj[b].push_back(a);
- }
- function<void(int, int)> dfs = [&](int u, int p) {
- dp[0][u] = v[0];
- dp[1][u] = v[1];
- vector<long long> tmp;
- for(auto e : adj[u]) {
- if(e != p) {
- dfs(e, u);
- dp[0][u] += dp[1][e];
- dp[1][u] += dp[1][e];
- tmp.push_back(dp[0][e] - dp[1][e]);
- }
- }
- sort(tmp.rbegin(), tmp.rend());
- long long l = dp[0][u], r = dp[1][u];
- for(int i = 0; i < (int)tmp.size(); i++) {
- l = l - v[i] + v[i + 1] + tmp[i];
- r = r - v[i + 1] + v[i + 2] + tmp[i];
- dp[0][u] = max(dp[0][u], l);
- dp[1][u] = max(dp[1][u], r);
- }
- };
- dfs(1, 0);
- cout << dp[0][1] << "\n";
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement