Submission #1164221

#TimeUsernameProblemLanguageResultExecution timeMemory
1164221altern23Sirni (COCI17_sirni)C++20
84 / 140
961 ms851968 KiB
#include <bits/stdc++.h>
using namespace std;
 
#define ll long long
#define pii pair<ll, ll>
#define fi first
#define sec second

const ll N = 1e7;
const ll INF = 4e18;
const ll MOD = 1e9 + 7;

struct DSU{
    ll n;
    vector<ll> par, sz;
    DSU(ll _n){
        n = _n;
        par.resize(n + 5), sz.resize(n + 5);
        for(int i = 1; i <= n; i++){
            par[i] = i, sz[i] = 1;
        }
    }

    ll find(ll idx){
        if(par[idx] == idx) return idx;
        return par[idx] = find(par[idx]);
    }

    bool join(ll a, ll b){
        a = find(a), b = find(b);
        if(a == b) return false;
        if(sz[a] < sz[b]) swap(a, b);
        par[b] = a;
        sz[a] += sz[b];
        sz[b] = 0;
        return true;
    }
};

vector<pii> edges[N + 5];
vector<ll> isi;
ll nxt[N + 5], ada[N + 5];

int main(){
    ios_base::sync_with_stdio(0); cin.tie(0); cout.tie(0);
    int tc = 1;
    // cin >> tc;
    for(;tc--;){
        ll n; cin >> n;
        vector<ll> a(n + 5);
        for(int i = 1; i <= n; i++){
            cin >> a[i];
            isi.push_back(a[i]);
            ada[a[i]] = 1;
        }

        sort(isi.begin(), isi.end());
        isi.erase(unique(isi.begin(), isi.end()), isi.end());

        ll cur = 0;
        for(int i = 1; i <= N; i++){
            while(cur < isi.size() && isi[cur] <= i) cur++;
            if(cur < isi.size()) nxt[i] = isi[cur];
        }

        DSU dsu(N);

        for(ll i = 0; i < isi.size(); i++){
            for(ll j = isi[i]; j <= N; j += isi[i]){
                if(ada[j]){
                    dsu.join(isi[i], j);
                }
                if(nxt[j]){
                    edges[nxt[j] % isi[i]].push_back({nxt[j], isi[i]});
                }
            }
        }

        ll ans = 0;
        for(ll i = 1; i <= N; i++){
            for(auto [x, y] : edges[i]){
                ans += dsu.join(x, y) * i;
            }
        }

        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...