Submission #1317173

#TimeUsernameProblemLanguageResultExecution timeMemory
1317173anarch_ySirni (COCI17_sirni)C++20
0 / 140
746 ms464568 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;
 
    DSU(int n){
        link.resize(n+1, 0);
        size.resize(n+1, 1);
        for(int i=1; i<=n; i++) link[i] = i;
    }
 
    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];
    }
};

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);
    }
    DSU D(m+1);
    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(i, 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){
                v[j] = 2;
                w[j].pb(i);
            }
        }
    }
    vector<int> p(m+1);
    int 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){
        for(auto k: w[j]){
            if(i%k == d){
                if(!D.same(i, k)){
                    D.merge(i, k);
                    ans += d;
                }
            }
        }
    }
    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...