Submission #1207089

#TimeUsernameProblemLanguageResultExecution timeMemory
1207089racsosabeSirni (COCI17_sirni)C++17
140 / 140
952 ms574380 KiB
#include<bits/stdc++.h>
using namespace::std;

const int N = 100000 + 5;
const int MAX = 10000000 + 2;
const int MAX_EDGES = 115129254 + 2;

int n;
int e;
int par[N];
int sizes[N];
int R[MAX];
int head[MAX];
vector<pair<int, int>> edges[MAX];

int get(int x) {
    return par[x] == x ? x : par[x] = get(par[x]);
}

void join(int a, int b) {
    a = get(a);
    b = get(b);
    if(a == b) return;
    if(sizes[a] > sizes[b]) swap(a, b);
    par[a] = b;
    sizes[b] += sizes[a];
}

int get_cost(int x, int y) {
    return min(x % y, y % x);
}

void init(vector<int> &a) {
    int at = (int)a.size() - 1;
    int last = -1;
    for(int i = MAX - 1; i >= 0; i--) {
        if(at >= 0 and a[at] == i) {
            last = at;
            at--;
        }
        R[i] = last;
    }
}

void get_edges(vector<int> &a) {
    init(a);
    int maximum = a.back();
    for(int i = 0; i < n; i++) {
        int x = a[i];
        int last_taken = -1;
        if(R[x + 1] != last_taken) {
            edges[get_cost(a[i], a[R[x + 1]])].emplace_back(i, R[x + 1]);
            last_taken = R[x + 1];
        }
        for(int l = x + x; l <= maximum; l += x) {
            int to = R[l];
            if(to != last_taken) {
                edges[get_cost(a[i], a[to])].emplace_back(i, to);
                last_taken = to;
            }
        }
    }
}

long long solve(vector<int> &a) {
    get_edges(a);
    for(int i = 0; i < n; i++) {
        par[i] = i;
        sizes[i] = 1;
    }
    long long res = 0;
    int maximum = a[n - 1];
    for(int i = 0; i < maximum; i++) {
        for(auto e : edges[i]) {
            int u, v;
            tie(u, v) = e;
            if(get(u) != get(v)) {
                res += i;
                join(u, v);
            }
        }
    }
    return res;
}

int main() {
    cin.tie(0) -> sync_with_stdio(false);
    cin >> n;
    vector<int> a(n);
    for(int i = 0; i < n; i++) cin >> a[i];
    sort(a.begin(), a.end());
    a.erase(unique(a.begin(), a.end()), a.end());
    n = a.size();
    cout << solve(a) << '\n';
    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...