/ SeriousOJ /

Record Detail

Accepted


  
# Status Time Cost Memory Cost
#1 Accepted 11ms 11.941 MiB
#2 Accepted 25ms 11.812 MiB
#3 Accepted 28ms 12.02 MiB
#4 Accepted 13ms 12.273 MiB
#5 Accepted 26ms 12.051 MiB
#6 Accepted 91ms 13.387 MiB
#7 Accepted 86ms 13.52 MiB
#8 Accepted 87ms 13.328 MiB
#9 Accepted 90ms 15.766 MiB
#10 Accepted 62ms 25.633 MiB
#11 Accepted 61ms 25.52 MiB
#12 Accepted 88ms 25.609 MiB
#13 Accepted 87ms 19.992 MiB
#14 Accepted 145ms 35.27 MiB
#15 Accepted 139ms 32.379 MiB
#16 Accepted 89ms 12.996 MiB

Code

#include <bits/stdc++.h>
using namespace std;
using ll = long long;
const ll mod = 1e9 + 7;
const int N = 500005;
const int INF = 0x3f3f3f3f;
ll dp[N][2], w[N];
ll res;
vector<pair<int, ll>> G[N];
ll c[N];
void dfs(int u, int fa) {
    for (auto [v, w] : G[u]) {
        if (v != fa) {
            c[v] = w;
            dfs(v, u);
        }
    }
    res = max(res, dp[u][0] + dp[u][1] - w[u]);
    if (dp[u][0] == -1e12) {
        ll cur = w[u] + w[fa] - (2ll * c[u]);
        if (dp[fa][0] <= cur) {
            swap(dp[fa][0], dp[fa][1]);
            dp[fa][0] = cur;
        } else {
            dp[fa][1] = max(dp[fa][1], cur);
        }
    } else {
        if (fa != 0) {
            ll cur1 = w[fa] + w[u] - (2ll * c[u]);
            ll cur2 = dp[u][0] + w[fa] - (2ll * c[u]);
            res = max(res, cur2);
            cur1 = max(cur1, cur2);
            if (dp[fa][0] <= cur1) {
                swap(dp[fa][0], dp[fa][1]);
                dp[fa][0] = cur1;
            } else {
                dp[fa][1] = max(dp[fa][1], cur1);
            }
        }
    }
}
int main() {
    ios::sync_with_stdio(0);
    cin.tie(0);
    cout.tie(0);
    int _;
    cin >> _;
    while (_--) {
        int n;
        cin >> n;
        for (int i = 1; i <= n; i++) cin >> w[i];
        for (int i = 1; i < n; i++) {
            int u, v;
            ll w;
            cin >> u >> v >> w;
            G[u].push_back({v, w});
            G[v].push_back({u, w});
        }
        for (int i = 0; i <= n; i++) {
            dp[i][0] = dp[i][1] = -1e12;
            c[i] = 0;
        }
        res = -1e18;
        dfs(1, 0);
        cout << res << "\n";
        for (int i = 1; i <= n; i++) G[i].clear();
    }
    return 0;
}

Information

Submit By
Type
Submission
Problem
P1205 E. Make Cycle in Tree
Language
C++17 (G++ 13.2.0)
Submit At
2025-07-15 03:47:29
Judged At
2025-07-15 03:47:29
Judged By
Score
100
Total Time
145ms
Peak Memory
35.27 MiB