제출 #1214806

#제출 시각아이디문제언어결과실행 시간메모리
1214806vaneaSirni (COCI17_sirni)C++20
0 / 140
350 ms65116 KiB
#include <bits/stdc++.h>
using namespace std;
using ll = long long;

const int mxN = 1e5+10;

int par[mxN];

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

bool uni(int a, int b) {
    a = get(a); b = get(b);
    if(a == b) return false;
    par[a] += par[b];
    par[b] = a;
    return true;
}

int main()
{
    ios_base::sync_with_stdio(0);
    cin.tie(0);
    int n;
    cin >> n;
    vector<int> p(n);
    for(int i = 0; i < n; i++) {
        cin >> p[i];
        par[i] = -1;
    }
    sort(p.begin(), p.end());
    p.erase(unique(p.begin(), p.end()), p.end());
    vector<array<int, 3>> edge_list;
    int mx = p.back();
    vector<int> next_largest(mx+1, -1);
    for(int i = 0; i < p.size(); i++) {
        next_largest[p[i]] = i;
    }
    for(int i = mx-1; i >= 1; i--) {
        if(next_largest[i] == -1) {
            next_largest[i] = next_largest[i+1];
        }
    }
    for(int i = 0; i < p.size(); i++) {
        int k = p[i];
        for(int j = k; j <= mx; j += k) {
            int nxt = next_largest[j];
            edge_list.push_back({p[nxt]%k, nxt, i});
        }
    }
    sort(edge_list.begin(), edge_list.end());
    int ans = 0;
    for(auto [it, a, b] : edge_list) {
        if(uni(a, b)) ans += it;
    }
    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...