Submission #1138083

#TimeUsernameProblemLanguageResultExecution timeMemory
1138083phamducminhSirni (COCI17_sirni)C++20
84 / 140
5115 ms790304 KiB
#include <bits/stdc++.h>
#include <iostream>
#include <cmath>
#include <vector>
#include <map>
#include <unordered_map>
#include <set>
#include <unordered_set>
#include <stack>
#include <algorithm>
#include <string>
#include <queue>
#include <cctype>
#include <cstring>
#include <iomanip>
#include <deque>
#include <random>
#include <sstream>

// #pragma GCC optimize("O3,unroll-loops")
// #pragma GCC target("avx,avx2,bmi,bmi2,popcnt,lzcnt")
// #pragma GCC optimize("Ofast","inline","no-stack-protector")
// #pragma GCC target("arch=skylake")

using namespace std;

#define file(name) freopen(name".inp","r",stdin);\
                    freopen(name".out","w",stdout);
#define TIME (1.0*clock()/CLOCKS_PER_SEC)
#define all(a) a.begin(),a.end()
#define all1(a) a+1,a+n+1
#define ll long long

const long long INF=1e18;
const long long MOD=1e9+7;
const long long MODD[] = {(long long)998244353,(long long)1e9+2277, (long long)1e9+5277}; // 998244353
const int maxN=2e5+9;
const long long LOG=19;
const double eps = 1e-1;


//------------------------



void solve();
signed main(){
    ios_base::sync_with_stdio(0);cin.tie(0);cout.tie(0);



    int t;

    // cin >> t;

    t=1;

    while (t--){
        solve();
    }

    return 0;
}

/// -------------- PROBLEM SOLUION --------------------



int n, a[100009];
int ans=0, ans1=0, mx=0;
bool visited[100009];



struct canh{
    int x, y, w;
};
vector<canh> dscanh;
int truoc[100009],rnk[100009];
vector<int> b;


void init(int n){
    for(int i=1; i<=n; i++){
        truoc[i] = i;
        rnk[i] = 1;
    }
}

int root(int u){
    if (truoc[u]==u) return u;
    return truoc[u]=root(truoc[u]);
}


bool hop(int x, int y){
    int u=root(x), v=root(y);

    if (u==v) return false;
    if (rnk[u]<rnk[v]) swap(u,v);
    truoc[u]=v;
    rnk[u]+=rnk[v];

    return true;
}

bool cmp(canh a, canh b){
    return a.w < b.w;
}


void solve(){  

    cin >> n;
    for (int i=1; i<=n; i++){
        cin >> a[i];
        b.push_back(a[i]);
        mx=max(mx,a[i]);
    }



    sort(all(b));
    b.resize(unique(all(b)) - b.begin());
 
    for(int i=0; i<b.size(); i++)
        a[i+1] = b[i];
    n=b.size();
    
    if (n == 1) return cout << 0, void();
    if (a[1] == 1) return cout << 0, void();
    


    // sort(a+1,a+n+1);

    for (int i=2; i<=n; i++){
        ans+=min(a[1]%a[i], a[i]%a[1]);
    }

    // if (n>1000) return cout << 0, void();


    init(n+1);
    for (int i=1; i<=n; i++) {
        // for (int j=i+1; j<=n; j++) {
        //     int w = a[j] % a[i];
        //     dscanh.push_back({i, j, w});
        // }
    

        for (int m=a[i]; m<=mx; m+=a[i]){
            int it=lower_bound(a+i,a+n+1,m)-a;

            if (it>n) continue;
            if (m==a[i] && a[it]==a[i]) it++;
            if (it>n) continue;


            dscanh.push_back({i, it, a[it]%a[i]});
        }
    }


    sort(dscanh.begin(), dscanh.end(), cmp);

    int d1=0;
    for (int i=0; i<dscanh.size(); i++){
        if (d1==n-1) break;

        canh tmp = dscanh[i];
        if (hop(tmp.x, tmp.y)){
            ans1 += tmp.w;
            d1++;
        }
    }






    cout << min(ans,ans1);

}

    







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