Submission #1159441

#TimeUsernameProblemLanguageResultExecution timeMemory
1159441knhatdevDesignated Cities (JOI19_designated_cities)C++20
100 / 100
176 ms42700 KiB
#include <bits/stdc++.h>
#define fi first
#define se second
#define int long long
#define ii pair<int, int>
#define iii pair<int, ii>
using namespace std;

const int N = 4e5 + 1;
int n, w[N], sum, ans[N], d[N], par[N], vis[N], pos;
vector<iii> a[N];
vector<int> chia;

void dfs1(int u, int cha) {
    for (iii v : a[u]) {
        if (v.fi == cha) continue;
        dfs1(v.fi, u);
        w[u] += w[v.fi] + v.se.se;
    }
}

void reroot(int u, int cha) {
    for (iii v : a[u]) {
        if (v.fi == cha) continue;
        w[v.fi] = w[u] - v.se.se + v.se.fi;
        reroot(v.fi, u);
    }
}

void dfs2(int u, int cha) {
    par[u] = cha;
    for (iii v : a[u]) {
        if (v.fi == cha) continue;
        d[v.fi] = d[u] + v.se.fi + v.se.se;
        dfs2(v.fi, u);
    }
}

int dfs3(int u, int cha) {
    int mx = 0;
    for (iii v : a[u]) {
        if (v.fi == cha) continue;
        int tmp = dfs3(v.fi, u) + v.se.fi;
        if (!mx) mx = tmp;
        else {
            chia.push_back(min(mx, tmp));
            mx = max(mx, tmp);
        }
    }
    return mx;
}

main() {
    ios_base::sync_with_stdio(0);
    cin.tie(0); cout.tie(0);
    cin >> n;

    for (int i = 1; i < n; i++) {
        int u, v, d, c;
        cin >> u >> v >> d >> c;
        a[u].push_back({v, {d, c}});
        a[v].push_back({u, {c, d}});
        sum += d + c;
    }
    dfs1(1, -1);
    reroot(1, -1);

    int l = 1, r = 1;
    dfs2(1, -1);
    for (int i = 1; i <= n; i++) {
        if (w[i] + d[i] > w[l] + d[l]) l = i;
        ans[1] = max(ans[1], w[i]);
    }

    d[l] = 0;
    dfs2(l, -1);
    for (int i = 1; i <= n; i++) {
        if (w[i] + d[i] > w[r] + d[r]) r = i;
    }

    ans[2] = (w[l] + w[r] + d[r]) / 2;

    int u = r;
    pos = 2;
    while (u != -1) {
        vis[u] = true;
        u = par[u];
    }

    u = r;
    while (u != -1) {
        for (iii v : a[u]) {
            if (vis[v.fi]) continue;
            chia.push_back(dfs3(v.fi, u) + v.se.fi);
        }
        u = par[u];
    }

    sort(chia.begin(), chia.end(), greater<int>());
    for (int x : chia) {
        pos++;
        ans[pos] = ans[pos - 1] + x;
    }

    while (pos < n) {
        pos++;
        ans[pos] = sum;
    }

    int q;
    cin >> q;
    while (q--) {
        int k;
        cin >> k;
        cout << sum - ans[k] << '\n';
    }
}

Compilation message (stderr)

designated_cities.cpp:53:1: warning: ISO C++ forbids declaration of 'main' with no type [-Wreturn-type]
   53 | main() {
      | ^~~~
#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...