Submission #1010896

#TimeUsernameProblemLanguageResultExecution timeMemory
1010896overwatch9Sirni (COCI17_sirni)C++17
140 / 140
955 ms747792 KiB
#include <bits/stdc++.h>
using namespace std;
using ll = long long;
struct DSU {
    vector <int> link, sz;
    DSU (int s) {
        link = sz = vector <int> (s+1);
        for (int i = 0; i <= s; i++) {
            link[i] = i;
            sz[i] = 1;
        }
    }
    int head(int x) {
        if (x == link[x])
            return x;
        return link[x] = head(link[x]);
    }
    bool same(int a, int b) {
        return head(a) == head(b);
    }
    void unite(int a, int b) {
        a = head(a);
        b = head(b);
        if (sz[a] < sz[b])
            swap(a, b);
        sz[a] += b;
        link[b] = a;
    }
};
const int maxp = 1e7 + 1;
int nxt[maxp];
vector <array <int, 3>> costs;
vector <pair <int, int>> edges[maxp];
int main() {
    ios_base::sync_with_stdio(false);
    cin.tie(0);
    cout.tie(0);
    int n;
    cin >> n;
    vector <int> nums(n);
    for (int i = 0; i < n; i++)
        cin >> nums[i];
    sort(nums.begin(), nums.end());
    nums.erase(unique(nums.begin(), nums.end()), nums.end());
    int mx = nums.back();
    fill(nxt, nxt + mx + 1, -1);
    n = nums.size();
    for (int i = 0; i < n; i++)
        nxt[nums[i]] = i;
    for (int i = 0; i < n; i++) {
        for (int j = nums[i]-1; j >= 0 && nxt[j] == -1; j--)
            nxt[j] = nxt[j+1];
    }
    for (int j = mx; j >= nums.back(); j--)
        nxt[j] = n-1;
    for (int i = 0; i < n; i++) {
        if (i+1 < n)
            edges[nums[i+1] % nums[i]].push_back({i, i+1});
        for (int j = nums[i]; j <= mx; j += nums[i]) {
            edges[nums[nxt[j]] % nums[i]].push_back({i, nxt[j]});
        }
    }
    
    ll ans = 0;
    DSU dsu(n+1);
    for (int i = 0, cnt = 0; cnt < n-1 && i <= mx; i++) {
        for (auto j : edges[i]) {
            if (!dsu.same(j.first, j.second)) {
                dsu.unite(j.first, j.second);
                ans += i;
                cnt++;
            }
            if (cnt == n-1)
                break;
        }
    }
    cout << ans << '\n';
}
#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...