Submission #1233818

#TimeUsernameProblemLanguageResultExecution timeMemory
1233818Bui_Quoc_CuongDesignated Cities (JOI19_designated_cities)C++20
100 / 100
321 ms49584 KiB
#include <bits/stdc++.h>
using namespace std;
const int maxn = 2e5 + 5;

int n;
struct Edges{
    int v, w1, w2;
}; vector <Edges> g[maxn];

long long dp[maxn];
array <long long, 2> dp1[maxn];
array <long long, 3> dp2[maxn];
long long ans[maxn];
long long tot = 0;

void dfs(int u, int p){
    for(auto e : g[u]){
        int v = e.v, w2 = e.w2;
        if(v == p) continue;
        dfs(v, u);
        dp[u]+= dp[v] + w2;
    }   
    dp1[u] = {dp[u], u};
    dp2[u] = {0, u, u};
    for(auto e : g[u]){
        int v = e.v, w1 = e.w1, w2 = e.w2;
        if(v == p) continue;

        dp2[u] = max(dp2[u], {dp1[v][0] + w1 + dp[u] - dp[v], u, dp1[v][1]});
        dp2[u] = max(dp2[u], {dp1[u][0] + w1 - dp[v] + dp1[v][0], dp1[u][1], dp1[v][1]});
        dp2[u] = max(dp2[u], {dp2[v][0] + w1 + dp[u] - dp[v] - w2, dp2[v][1], dp2[v][2]});
        
        dp1[u] = max(dp1[u], {dp1[v][0] + w1 + dp[u] - dp[v], dp1[v][1]});
    }
}

void dfs_reroot(int u, int p, long long cur){
    ans[1] = min(ans[1], tot - cur);
    for(auto e : g[u]){
        int v = e.v, w1 = e.w1, w2 = e.w2;
        if(v == p) continue;    
        dfs_reroot(v, u, cur - w2 + w1);
    }
}

priority_queue <long long, vector <long long>> pq;

long long dfs_for_all(int u, int p){
    if(u == dp2[1][2]) return 1e18; 
    vector <long long> zip;

    for(auto e : g[u]){
        int v = e.v, w1 = e.w1;
        if(v == p) continue;
        zip.push_back(dfs_for_all(v, u) + w1);
    }

    int pos = max_element(zip.begin(), zip.end()) - zip.begin();

    for(int i = 0; i < (int)zip.size(); i++){
        if(i == pos) pq.push(0);
        else pq.push(zip[i]);
    }

    if(zip.empty()) return 0;
    return zip[pos];
}

signed main(){
    ios_base::sync_with_stdio(false);
    cin.tie(nullptr);

    cin >> n;

    for(int i = 1; i < n; i++){
        int u, v, w1, w2; cin >> u >> v >> w1 >> w2;
        g[u].push_back({v, w1, w2}); g[v].push_back({u, w2, w1});
        tot+= w1 + w2;
    }

    memset(ans, 0x3f, sizeof ans);
    dfs(1, 1);
    ans[2] = tot - dp2[1][0];
    dfs_reroot(1, 1, dp[1]);
    dfs_for_all(dp2[1][1], dp2[1][1]);

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

    int q; 
    cin >> q;
    while(q--){
        int t; cin >> t;
        cout << ans[t] << "\n";
    }

    return 0;
}
#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...