Submission #1245919

#TimeUsernameProblemLanguageResultExecution timeMemory
1245919mcsar2002Sirni (COCI17_sirni)C++20
112 / 140
5107 ms434532 KiB
#include <bits/stdc++.h>
#define ll long long

using namespace std;
struct edge{
    int u, v, w;
};
const int N = 1e5 + 7;
const int P = 1e7 + 7;
int par[N], nxt[P];
vector<int> p;
vector<edge> e;
int root(int u) {
    return u == par[u] ? u : par[u] = root(par[u]);
}
bool dsu(int u, int v) {
    if ((u = root(u)) == (v = root(v))) return false;
    par[v] = u;
    return true;
}
signed main() {
    ios_base::sync_with_stdio(0);
    cin.tie(0); cout.tie(0);
    
    int n; cin >> n;
    for (int i = 1; i <= n; i++) {
        int x; cin >> x;
        p.push_back(x);
    }
    sort(p.begin(), p.end());
    p.erase(unique(p.begin(), p.end()), p.end());
    n = p.size();
    iota(par, par + n, 0);
    for (int i = 0; i < n; i++) {
        nxt[p[i]] = i;
        for (int j = p[i] + 1; j < p[i + 1]; j++) {
            nxt[j] = i + 1;
        }
    }
    nxt[p[n - 1]] = n - 1;
    for (int i = 0; i < n; i++) {
        e.push_back({i, nxt[p[i] + 1], p[nxt[p[i] + 1]] % p[i]});
        for (int j = (p[nxt[p[i] + 1]] / p[i] * p[i]) + p[i]; j <= p[n - 1]; j += p[i]) {
            e.push_back({i, nxt[j], p[nxt[j]] % p[i]});
            j = p[nxt[j]] / p[i] * p[i];
        }
    }
    sort(e.begin(), e.end(), [&](edge x, edge y) {
        return x.w < y.w;
    });
    int ans = 0;
    for (auto x : e) {
        if (!dsu(x.u, x.v)) continue;
        ans += x.w;
    }
    cout << ans << '\n';
    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...