Submission #667509

#TimeUsernameProblemLanguageResultExecution timeMemory
667509tanprodiumSirni (COCI17_sirni)C++14
126 / 140
5025 ms435536 KiB
#include<bits/stdc++.h>

using namespace std;

using ll = long long;

struct Edge {
    int u, v, w;

    Edge() {}
    Edge(int _u, int _v, int _w): u(_u), v(_v), w(_w) {}

    bool operator < (const Edge &other) const {
        return (w < other.w);
    }
};

const int N = 1e5;
const int V = 1e7;

vector<Edge> e;
int a[N + 5];
int par[N + 5];
int id[V + 5];
vector<int> cpr;

int getpar(int u) {
    while (par[u] > 0) u = par[u];
    return (u);
}

bool uni(int u, int v) {
    u = getpar(u), v = getpar(v);

    if (u == v) return (false);

    if (par[u] > par[v]) swap(u, v);

    par[u] += par[v];
    par[v] = u;

    return (true);
}

void solve() {
    int n;
    cin >> n;

    for (int i = 1; i <= n; i++) {
        cin >> a[i];
        cpr.push_back(a[i]);
    }

    sort(cpr.begin(), cpr.end());
    cpr.resize(unique(cpr.begin(), cpr.end()) - cpr.begin());

    n = (int)cpr.size();

    vector<int> vec;

    for (int i = 1; i <= n; i++) {
        par[i] = -1;
        a[i] = cpr[i - 1];
        id[a[i]] = i;
        vec.push_back(a[i]);
    }

    for (int i = 1; i <= n; i++) {
        int val = a[i];
        int d = 1;

        while (true) {
            int take = max(val + 1, val * d);;
            auto iter = lower_bound(vec.begin(), vec.end(), take);
            if (iter == vec.end()) break;
            int nval = *iter;
            int j = id[nval];

            int dist = nval % val;
            e.emplace_back(i, j, dist);

            d = nval / val + 1;
        }
    }

    sort(e.begin(), e.end());
    int sz = (int)e.size();

    ll ans = 0;

    for (int i = 0; i < sz; i++) {
        int u = e[i].u, v = e[i].v, w = e[i].w;
        //cout << u << ' ' << v << ' ' << w << '\n';

        if (uni(u, v)) ans += 1ll * w;
    }

    cout << ans;
}

int main() {
    ios_base::sync_with_stdio(false);
    cin.tie(0); cout.tie(0);
    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...