Submission #1167671

#TimeUsernameProblemLanguageResultExecution timeMemory
1167671TurkhuuSirni (COCI17_sirni)C++20
126 / 140
1233 ms851968 KiB
#include <bits/stdc++.h>
#define FOR(i, a, b) for (auto i = (a); i <= (b); i++)
#define ROF(i, a, b) for (auto i = (a); i >= (b); i--)
using namespace std;
using ll = long long;
struct DSU {
    int n, comp; vector<int> a;
    DSU(int n = 0) : n(n), comp(n), a(n, -1) {}
    int operator[](int x) {return find(x);}
    int find(int x) {return a[x] < 0 ? x : a[x] = find(a[x]);}
    int size(int x) {return -a[find(x)];}
    bool same(int a, int b) {return find(a) == find(b);}
    int unite(int x, int y) {
        if ((x = find(x)) == (y = find(y))) return x;
        if (a[x] > a[y]) swap(x, y);
        return comp--, a[x] += a[y], a[y] = x;
    }
};
void solve() {
    int m, n = 0;
    cin >> m;
    vector<int> p(m);
    for (int& i : p) {
        cin >> i;
        n = max(n, i);
    }
    vector<int> a(n + 1);
    for (int i : p) a[i] = 1;
    vector<vector<array<int, 2>>> edges(n);
    vector<int> nxt(n + 2);
    ROF(i, n, 1) {
        nxt[i] = nxt[i + 1];
        if (a[i]) {
            for (int j = i; j <= n; j += i) {
                if (nxt[j]) {
                    edges[nxt[j] % i].push_back({i, nxt[j]});
                }
            }
            nxt[i] = i;
        }
    }
    DSU dsu(n + 1);
    ll ans = 0;
    FOR(i, 0, n - 1) {
        for (auto [x, y] : edges[i]) {
            if (!dsu.same(x, y)) {
                ans += i;
                dsu.unite(x, y);
            }
        }
    }
    cout << ans << "\n";
}
int main() {
    ios::sync_with_stdio(false);
    cin.tie(nullptr);
    solve();
    return 6/22;
}
#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...