Submission #1192117

#TimeUsernameProblemLanguageResultExecution timeMemory
1192117_callmelucianSirni (COCI17_sirni)C++17
112 / 140
5103 ms394892 KiB
#include <bits/stdc++.h>
using namespace std;

using ll = long long;
using ld = long double;
using pl = pair<ll,ll>;
using pii = pair<int,int>;
using tpl = tuple<int,int,int>;

#define all(a) a.begin(), a.end()
#define filter(a) a.erase(unique(all(a)), a.end())

struct DSU {
    vector<int> lab;
    DSU (int sz) : lab(sz + 1, -1) {}

    int get (int u) {
        if (lab[u] < 0) return u;
        return lab[u] = get(lab[u]);
    }

    bool unite (int a, int b) {
        a = get(a), b = get(b);
        if (a == b) return 0;
        if (-lab[a] < -lab[b]) swap(a, b);
        lab[a] += lab[b], lab[b] = a;
        return 1;
    }
};

int main()
{
    ios::sync_with_stdio(0);
    cin.tie(0);

    /// read input & refine
    int n; cin >> n;
    vector<int> a(n);
    for (int &u : a) cin >> u;
    sort(all(a)), filter(a), n = a.size();
    int mx = *max_element(all(a));

    /// edge case
    if (a[0] == 1) return cout << 0, 0;

    /// generate potential edges
    vector<tpl> edges;
    for (int i = 0; i < n; i++) {
        for (int mult = 1; 1LL * a[i] * mult <= mx; mult++) {
            // build edge
            int nxt = lower_bound(all(a), max(a[i] + 1, a[i] * mult)) - a.begin();
            if (nxt < n) {
                mult = a[nxt] / a[i];
                edges.emplace_back(a[nxt] - a[i] * mult, i, nxt);
            }
        }
    }
    sort(all(edges));

    /// build MST using Kruskal algorithm
    DSU dsu(n); ll ans = 0;
    for (tpl iter : edges) {
        int weight, a, b; tie(weight, a, b) = iter;
        if (dsu.unite(a, b)) ans += weight;
    }
    cout << ans;

    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...