제출 #1362741

#제출 시각아이디문제언어결과실행 시간메모리
1362741nguyenkhangninh99Designated Cities (JOI19_designated_cities)C++20
100 / 100
187 ms43644 KiB
#include<bits/stdc++.h>
using namespace std;

#define int long long
bool maximize(int &a, int b){
    if(a < b){
        a = b;
        return true;
    }else return false;
}
bool minimize(int &a, int b){
    if(b < a){
        a = b;
        return true;
    }else return false;
}

const int maxn = 2e5 + 5;
int heavy[maxn], base[maxn], leaf[maxn], mx2[maxn], mx[maxn];
vector<array<int, 3>> adj[maxn];
vector<int> val;

void dfs1(int u, int p){
    for(auto [v, w, _]: adj[u]){
        if(v == p) continue;
        base[1] += w;
        dfs1(v, u);
    }
}
void dfs2(int u, int p){
    leaf[u] = u;
    for(auto [v, w, c]: adj[u]){
        if(v == p) continue;
        base[v] = base[u] - w + c;
        dfs2(v, u);
        if(maximize(mx[u], mx[v] + w)) leaf[u] = leaf[v];
    }
}
int root = 1, mn = 4e18; 
void dfs3(int u, int p){
    int m1 = 0, m2 = 0, leaf1 = u;

    for(auto [v, w, _]: adj[u]){
        if(v == p) continue;
        int x = w + mx[v];
        if(x > m1){
            m2 = m1;
            m1 = x;
            leaf1 = leaf[v];
        } else m2 = max(m2, x);
        dfs3(v, u);
    }
    if(minimize(mn, base[u] - m1 - m2)) root = leaf1;
}

void dfs4(int u, int p){
    heavy[u] = -1;
    for(auto [v, w, _]: adj[u]){
        if(v == p) continue;
        dfs4(v, u);
        if(maximize(mx2[u], w + mx2[v])) heavy[u] = v;
    }
}

void decompose(int u, int p, int cur){
    if(heavy[u] == -1) val.push_back(cur); //tới lá
    for(auto [v, w, _]: adj[u]){
        if(v == p) continue;
        if(v == heavy[u]) decompose(v, u, cur + w);
        else decompose(v, u, w);
    }
}

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

    int n; cin >> n;
    for(int i = 1; i <= n - 1; i++){
        int u, v, c, d; cin >> u >> v >> c >> d;
        adj[u].push_back({v, c, d});
        adj[v].push_back({u, d, c});
    }
    dfs1(1, 0);
    dfs2(1, 0);
    dfs3(1, 0);
    dfs4(root, 0);
    decompose(root, 0, 0);
    sort(val.rbegin(), val.rend());

    vector<int> ans(n + 1);
    ans[1] = *min_element(base + 1, base + n + 1); 

    int cur = 0;
    for(int i = 2; i <= n; i++){
        if(i - 2 < val.size()) cur += val[i - 2];
        ans[i] = base[root] - cur; 
    }
    int q; cin >> q;
    while(q--){
        int x; cin >> x;
        cout << ans[x] << "\n";
    }
}
#결과 실행 시간메모리채점기 출력
결과를 불러오는 중입니다…
#결과 실행 시간메모리채점기 출력
결과를 불러오는 중입니다…
#결과 실행 시간메모리채점기 출력
결과를 불러오는 중입니다…
#결과 실행 시간메모리채점기 출력
결과를 불러오는 중입니다…
#결과 실행 시간메모리채점기 출력
결과를 불러오는 중입니다…
#결과 실행 시간메모리채점기 출력
결과를 불러오는 중입니다…