Submission #1211584

#TimeUsernameProblemLanguageResultExecution timeMemory
1211584JooDdaeDesignated Cities (JOI19_designated_cities)C++20
100 / 100
287 ms54176 KiB
#include <bits/stdc++.h>
using namespace std;
using ll = long long;

int n, m, a[200200], b[200200], c[200200], d[200200];
ll ans[200200], dp[200200];
array<ll, 2> dp1[200200];
array<ll, 3> dp2[200200];
vector<int> v[200200];

void dfs(int u, int p) {
    for(auto i : v[u]) {
        int x = a[i] ^ b[i] ^ u;
        if(x == p) continue;
        dfs(x, u);
        dp[u] += dp[x] + (u == a[i] ? d[i] : c[i]);
    }

    dp1[u] = {dp[u], u}, dp2[u] = {0, u, u};

    for(auto i : v[u]) {
        int x = a[i] ^ b[i] ^ u;
        if(x == p) continue;

        int y = u == a[i] ? c[i] : d[i];
        int z = c[i] ^ d[i] ^ y;

        auto C = dp[u]-dp[x]-z;

        dp2[u] = max(dp2[u], array<ll, 3>({dp1[u][0]-dp[x]+dp1[x][0]+y, dp1[u][1], dp1[x][1]}));
        dp2[u] = max(dp2[u], array<ll, 3>({dp2[x][0]+y + C, dp2[x][1], dp2[x][2]}));
        
        dp1[u] = max(dp1[u], array<ll, 2>({dp1[x][0]+y+z + C, dp1[x][1]}));
    }
}

priority_queue<ll> pq;

ll dfs2(int u, int p) {
    if(u == dp2[1][2]) return 1e18;

    ll re = 0;
    for(auto i : v[u]) {
        int x = a[i] ^ b[i] ^ u;
        if(x == p) continue;
        ll K = dfs2(x, u) + (u == a[i] ? c[i] : d[i]);
        pq.push(min(re, K)), re = max(re, K);
    }
    return re;
}

void dfs3(int u, int p, ll S) {
    ans[1] = max(ans[1], S);
    for(auto i : v[u]) {
        int x = a[i] ^ b[i] ^ u;
        if(x == p) continue;
        dfs3(x, u, S + (u == a[i] ? c[i]-d[i] : d[i]-c[i]));
    }
}

int main() {
    cin.tie(0)->sync_with_stdio(0);
    cin >> n;
    for(int i=1;i<n;i++) {
        cin >> a[i] >> b[i] >> c[i] >> d[i];
        v[a[i]].push_back(i), v[b[i]].push_back(i);
        ans[2] += c[i]+d[i];
    }


    dfs(1, 0);
    dfs2(dp2[1][1], 0);
    dfs3(1, 0, dp[1]);

    ans[1] = ans[2] - ans[1];
    ans[2] -= dp2[1][0];
    for(int i=3;i<=n;i++) {
        ans[i] = ans[i-1] - pq.top(), pq.pop();
    }

    cin >> m;
    while(m--) {
        int x; cin >> x;
        cout << ans[x] << '\n';
    }
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...