Submission #1194231

#TimeUsernameProblemLanguageResultExecution timeMemory
1194231SnowRaven52Sirni (COCI17_sirni)C++20
0 / 140
208 ms292064 KiB
#include <bits/stdc++.h>
using namespace std;

struct DSU {
    vector<int> p;
    DSU(int n): p(n, -1) {}
    int find(int x){
        return p[x]<0 ? x : p[x] = find(p[x]);
    }
    bool unite(int x, int y){
        x = find(x); y = find(y);
        if(x==y) return false;
        if(-p[x] > -p[y]) swap(x,y);
        p[y] += p[x];
        p[x] = y;
        return true;
    }
};

int main(){
    ios::sync_with_stdio(false);
    cin.tie(nullptr);

    int n;
    cin >> n;
    vector<int> a(n);
    for(int i = 0; i < n; i++){
        cin >> a[i];
    }

    sort(a.begin(), a.end());
    a.erase(unique(a.begin(), a.end()), a.end());
    n = a.size();

    int M = a.back();

    vector<int> nxt(M+2, 0);
    for(int i = 0; i < n; i++){
        nxt[a[i]] = i+1;
    }
    for(int i = M; i >= 0; i--){
        if(nxt[i] == 0) 
            nxt[i] = nxt[i+1];
    }

    vector<vector<pair<int,int>>> edges(M+1);

    for(int i = 0; i < n; i++){
        int ai = a[i];
        for(int j = ai; j <= M; j += ai){
            int idx1 = nxt[j];
            if(idx1 == 0) 
                break;
            int k = idx1 - 1;
            if(k <= i) 
                continue;
            int cost = a[k] - j;
            edges[cost].push_back({i, k});
        }
    }

    DSU dsu(n);
    long long ans = 0;
    for(int c = 0; c <= M; c++){
        for(auto &e : edges[c]){
            if(dsu.unite(e.first, e.second)){
                ans += c;
            }
        }
    }

    cout << ans << endl;
}
#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...