Submission #667512

#TimeUsernameProblemLanguageResultExecution timeMemory
667512tanprodiumSirni (COCI17_sirni)C++14
42 / 140
5110 ms686388 KiB
#include<bits/stdc++.h>
#define fi first
#define se second

using namespace std;

using pii = pair<int, int>;
using ll = long long;

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

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

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]);
    }

    vector<int> exist;

    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;
            if (!flag[dist]) exist.push_back(dist);
            e[dist].push_back({i, j});

            d = nval / val + 1;
        }
    }

    sort(exist.begin(), exist.end());

    ll ans = 0;

    for (int x : exist) {
        for (pii y : e[x]) {
            int u = y.fi, v = y.se;

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

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