Submission #1198781

#TimeUsernameProblemLanguageResultExecution timeMemory
1198781dwuySirni (COCI17_sirni)C++20
0 / 140
5033 ms851968 KiB
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;

const int MX = 100005;
const int MV = 10000005;

struct DSU{
    int n;
    vector<int> e;

    DSU(int n = 0) : n(n), e(n + 5, -1) {}

    int fp(int u){
        return e[u] < 0? u : e[u] = fp(e[u]);
    }

    bool unon(int u, int v){
        u = fp(u);
        v = fp(v);
        if(u == v) return 0;
        if(e[u] > e[v]) swap(u, v);
        e[u] += e[v];
        e[v] = u;
        return 1;
    }
};

int n;
int a[MX];
int sum[MV];

int32_t main(){
    ios_base::sync_with_stdio(false);
    cin.tie(0);

    cin >> n;
    for(int i=1; i<=n; i++) cin >> a[i];
    sort(a + 1, a + 1 + n);

    DSU dsu(n);
    int cc = n - 1;
    for(int i=1; i<=n; i++){
        sum[a[i]] = 1;
        if(a[i] == a[i - 1]) cc -= dsu.unon(i, i - 1);
    }
    for(int i=1; i<MV; i++) sum[i] += sum[i-1];

    int lim = 0;
    for(int lo=0, hi=1e7; lo<=hi;){
        int mid = (lo + hi)>>1;
        int cnt = 0;
        for(int i=1; i<=n; i++) if(a[i] != a[i-1]){
            for(int j=a[i]; j<MV; j+=a[i]){
                int r = min({MV - 1, j + a[i] - 1, j + mid});
                cnt += sum[r] - sum[j-1];
            }
            cnt--;
        }
        if(cnt >= cc) lim = mid, hi = mid - 1;
        else lo = mid + 1;
    }

    vector<pair<int, pair<int, int>>> edges;
    for(int i=1; i<=n; i++){
        for(int j=a[i], t=i; t<=n; j+=a[i]){
            if(t<=n && a[t] < j) t = lower_bound(a + t + 1, a + n + 1, j) - a;
            while(t <= n && a[t] <= j + min(a[i] - 1, lim)){
                edges.push_back({a[t]%a[i], {i, t}});
                t++;
            }
        }
    }

    int ans = 0;

    sort(edges.begin(), edges.end());
    for(pair<int, pair<int, int>> e: edges){
        if(dsu.unon(e.second.first, e.second.second)) ans += e.first;
    }

    cout << ans;
    
    return 0;
}
#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...