Submission #1326659

#TimeUsernameProblemLanguageResultExecution timeMemory
1326659SzilSirni (COCI17_sirni)C++20
0 / 140
1022 ms99412 KiB
#include <bits/stdc++.h>

using namespace std;
using ll = long long;

struct dsu {

    vector<int> par, siz;

    dsu(int n) {
        par.resize(n);
        siz.resize(n+1, 1);
        iota(par.begin(), par.end(), 0);
    }

    int holvan(int u) {
        return par[u] == u ? u : par[u] = holvan(par[u]);
    }

    bool unio(int u, int v) {
        u = holvan(u); v = holvan(v);
        if (u == v) return false;
        if (siz[u] > siz[v]) swap(u, v);
        siz[v] += siz[u];
        par[u] = v;
        return true;
    }

};

void solve() {
    int n; cin >> n;
    vector<int> v(n);
    for (int i = 0; i < n; i++) cin >> v[i];

    sort(v.begin(), v.end());
    v.erase(unique(v.begin(), v.end()), v.end());
    int m = v.size();
    vector<array<int, 3>> edges;
    for (int i = 0; i < m; i++) {
        for (int j = v[i]; j <= 500'000; j+=v[i]) {
            auto it = lower_bound(v.begin(), v.end(), j);
            if (it != v.end()) {
                edges.push_back({(*it)-j, (int)(it-v.begin()), i});
                it++;
                if (it != v.end()) edges.push_back({(*it)-j, (int)(it-v.begin()), i});
            } else break;
        }
    }
    sort(edges.begin(), edges.end());
    ll ans = 0;
    dsu d(m);
    for (auto [w, u, v] : edges) {
        if (d.unio(u, v)) ans += w;
    }
    cout << ans << "\n";
}

int main() {
    ios::sync_with_stdio(0); cin.tie(0);
    int t = 1; 
    // cin >> t;
    while (t--) solve();
    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...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...