제출 #1188886

#제출 시각아이디문제언어결과실행 시간메모리
1188886zwezdinvSecurity Guard (JOI23_guard)C++20
26 / 100
4091 ms16684 KiB
#include<bits/stdc++.h>
using namespace std;

using ll = long long;

struct DSU {
    vector<int> p;

    DSU() = default;

    DSU(int n) : p(n) {
        iota(p.begin(), p.end(), 0);
    }

    int get(int u) {
        while (u != p[u]) u = p[u] = p[p[u]];
        return u;
    }

    bool unite(int u, int v) {
        u = get(u), v = get(v);
        if (u == v) return false;
        p[v] = u;
        return true;
    }
};

int main() {
    cin.tie(nullptr)->sync_with_stdio(false);

    int n, m, q;
    cin >> n >> m >> q;
    vector<ll> s(n);
    for (auto& i : s) cin >> i;
    vector<tuple<ll, int, int>> edges;
    for (int i = 0; i < m; ++i) {
        int u, v;
        cin >> u >> v;
        --u, --v;
        edges.emplace_back(s[u] + s[v], u, v);
    }
    sort(edges.begin(), edges.end());
    vector<tuple<ll, int, int>> tr;
    vector<vector<int>> g(n);
    {
        DSU dsu(n);
        for (auto [w, u, v] : edges) {
            if (dsu.unite(u, v)) {
                tr.emplace_back(w, u, v);
            }
        }
    }
    vector<ll> ans(n);
    DSU dsu(n);
    vector<ll> mn = s;
    ll base = *max_element(s.begin(), s.end()) - accumulate(s.begin(), s.end(), 0ll);
    ll mst = accumulate(s.begin(), s.end(), 0ll);
    ll mns = *min_element(s.begin(), s.end());
    ans[n - 1] = mst + base + (n - 2) * mns;
    for (int k = n - 2; k >= 0; --k) {
        tuple<ll, int, int> opt = {-1, -1, -1};
        ll mnv = 1e18;
        for (auto [w, u, v] : tr) {
            u = dsu.get(u), v = dsu.get(v);
            if (u == v) continue;
            ll val = -max(mn[u], mn[v]) + w;
            if (val < mnv) {
                mnv = val;
                opt = {w, u, v};
            }
        }
        mst += mnv;
        auto [w, u, v] = opt;
        u = dsu.get(u), v = dsu.get(v);
        dsu.unite(u, v);
        mn[dsu.get(u)] = min(mn[u], mn[v]);
        ans[k] = mst + base + (k - 1) * mns;
    }
    for (int i = 0; i <= q; ++i) {
        cout << ans[min(n - 1, i)] << '\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...
#Verdict Execution timeMemoryGrader output
Fetching results...