Submission #734517

#TimeUsernameProblemLanguageResultExecution timeMemory
734517TahirAliyevSirni (COCI17_sirni)C++17
140 / 140
2883 ms534908 KiB
#include <bits/stdc++.h>
 
#pragma GCC optimize("O3")
 
using namespace std;
 
#define ll long long int
#define oo 1e9
#define pii pair<int, int>



const int MAX = 1e5 + 5;
int n;

int par[MAX];

int findSet(int u){
    if(par[u] < 0) return u;
    return par[u] = findSet(par[u]);
}

bool unite(int u, int v){
    u = findSet(u);
    v = findSet(v);
    if(u == v) return false;
    if(-par[u] < -par[v]) swap(u, v);
    par[u] += par[v];
    par[v] = u;
    return true;
}

bool check(int u, int v){
    u = findSet(u);
    v = findSet(v);
    if(u == v) return true;
    return false;
}

int v[MAX];
vector<pii> edges[int(1e7 + 7)];

void solve(){
    memset(par, -1, sizeof(par));
    cin >> n;
    for (int i = 0; i < n; i++)
    {
        cin >> v[i];
    }
    sort(v, v + n);
    int m = v[n - 1];
    for (int i = 0; i < n; i++)
    {
        if(i != 0 && v[i] == v[i - 1]) continue;
        for (int r = v[i]; r <= m; r += v[i])
        {
            auto itr = lower_bound(v, v + n, r);
            if(r == v[i]){
                itr = upper_bound(v, v + n, r);
            }
            if(itr == (v + n)){
                break;
            }
            if((*itr) >= (r + v[i])){
                r = (*itr) / v[i] * v[i];
            }
            edges[(*itr) % v[i]].push_back({i, int(itr - v)});
        }
    }
    ll ans = 0;
    for(int i = 0; i <= 1e7; ++i){
        for(auto& p:edges[i]){
            if(unite(p.first, p.second)){
                ans += i;
            }
        }
    }
    cout << ans;
}

int main(){
    solve();
}
#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...