Submission #1317206

#TimeUsernameProblemLanguageResultExecution timeMemory
1317206anarch_ySirni (COCI17_sirni)C++20
84 / 140
4726 ms851968 KiB
#include <bits/stdc++.h>
using namespace std;
using ll = long long;
#define all(x) begin(x), end(x)
#define sz(x) (int)x.size()
#define pb push_back

struct DSU{
    vector<int> link, size;
    int cc;
 
    DSU(int n){
        link.resize(n+1, 0);
        size.resize(n+1, 1);
        for(int i=1; i<=n; i++) link[i] = i;
        cc = n;
    }
 
    int find(int x){
        if(x != link[x]) link[x] = find(link[x]);
        return link[x];
    }
 
    bool same(int a, int b){
        return find(a) == find(b);
    }
    
    void merge(int a, int b){
        if(same(a, b)) return;
        a = find(a); b = find(b);
        if(size[a] > size[b]) swap(a, b);
        link[a] = b;
        size[b] += size[a];
        cc--;
    }
};

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

    int n; cin >> n;
    vector<int> v(1e7+1);
    int m = 0;
    for(int i=1; i<=n; i++){
        int x; cin >> x;
        v[x] = 1;
        m = max(m, x);
    }
    vector<int> mp(m+1);
    int c = 0;
    for(int i=1; i<=m; i++){
        if(v[i] == 1){
            mp[i] = ++c;
        }
    }
    n = c;
    DSU D(n);
    for(int i=1; i<=m; i++){
        if(v[i] == 1){
            for(int j=2*i; j<=m; j+=i){
                if(v[j] == 1){
                    D.merge(mp[i], mp[j]);
                }
            }
        }
    }
    vector<int> w[m+1];
    for(int i=1; i<=m; i++){
        if(v[i] == 1){
            w[i].pb(i);
            for(int j=2*i; j<=m; j+=i){
                if(v[j] == 0) v[j] = 2;
                w[j].pb(i);
            }
        }
    }
    vector<int> p(m+1);
    c = 0;
    for(int i=1; i<=m; i++){
        if(v[i] == 0) continue;
        p[i] = c;
        c = i;
    }
    vector<array<int, 3>> vec;
    for(int i=1; i<=m; i++){
        if(v[i] == 1){
            int j = p[i];
            if(j == 0) continue;
            while(true){
                vec.pb({i-j, i, j});
                if(v[j] == 1) break;
                j = p[j];
            }
        }
    }
    sort(all(vec));
    ll ans = 0LL;
    for(auto [d, i, j]: vec){
        if(D.cc == 1) break;
        for(auto k: w[j]){
            if(i%k == d){
                if(!D.same(mp[i], mp[k])){
                    D.merge(mp[i], mp[k]);
                    ans += d;
                }
            }
            if(D.cc == 1) break;
        }
    }
    cout << ans;
}
#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...