Submission #1207091

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

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

int n;
int par[N];
int sizes[N];
int R[MAX];
int who[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 get_edges(vector<int> &a) {
    int maximum = a.back();
    int at = (int)a.size() - 1;
    int last = -1;
    for(int i = maximum; i >= 1; i--) {
        if(at >= 0 and a[at] == i) {
            who[i] = at;
            int last_taken = -1;
            if(last != last_taken) {
                edges[get_cost(i, last)].emplace_back(i, last);
                last_taken = last;
            }
            for(int l = (i << 1); l <= maximum; l += i) {
                int to = R[l];
                if(to != last_taken) {
                    edges[get_cost(i, to)].emplace_back(i, to);
                    last_taken = to;
                }
            }
            last = i;
            at--;
        }
        R[i] = last;
    }
}

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;
            u = who[u], v = who[v];
            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...