Submission #1245852

#TimeUsernameProblemLanguageResultExecution timeMemory
1245852khoiSirni (COCI17_sirni)C++20
0 / 140
27 ms5604 KiB
#include <bits/stdc++.h>
using namespace std;

struct Edge {
    int u, v;
    long long w;
    bool operator<(Edge const& o) const { return w < o.w; }
};

struct DSU {
    vector<int> par, rank;
    DSU(int n): par(n+1), rank(n+1, 0) {}
    void make_set(int u) {
        par[u] = u;
        rank[u] = 0;
    }
    int find_set(int v) {
        return par[v] == v ? v : par[v] = find_set(par[v]);
    }
    bool union_set(int u, int v) {
        u = find_set(u);
        v = find_set(v);
        if (u == v) return false;
        if (rank[u] < rank[v]) swap(u, v);
        par[v] = u;
        if (rank[u] == rank[v]) rank[u]++;
        return true;
    }
};

int n, p[100005];
vector<Edge> e;

int main() {
    ios_base::sync_with_stdio(0); cin.tie(0); cout.tie(0);
    cin >> n;
    for (int i = 1; i <= n; i++) cin >> p[i];

    // Tìm chỉ số có giá trị nhỏ nhất
    int idx = 1;
    for (int i = 2; i <= n; i++) {
        if (p[i] < p[idx]) idx = i;
    }

    // Thêm các cạnh từ các đỉnh khác đến đỉnh nhỏ nhất
    for (int i = 1; i <= n; i++) {
        if (i == idx) continue;
        int w = min(p[i] % p[idx], p[idx] % p[i]);
        e.push_back({idx, i, w});
    }

    // Thêm cạnh giữa các phần tử gần nhau (kề nhau khi sort)
    vector<pair<int, int>> v(n);
    for (int i = 1; i <= n; i++) {
        v[i-1] = {p[i], i};  // value, index
    }
    sort(v.begin(), v.end());
    for (int i = 1; i < n; i++) {
        int a = v[i-1].second;
        int b = v[i].second;
        int w = min(p[a] % p[b], p[b] % p[a]);
        e.push_back({a, b, w});
    }

    sort(e.begin(), e.end());

    DSU d(n);
    for (int i = 1; i <= n; i++) d.make_set(i);

    long long total = 0;
    int count = 0;
    for (auto [u, v, w] : e) {
        if (d.union_set(u, v)) {
            total += w;
            if (++count == n - 1) break;
        }
    }

    cout << total << '\n';
}
#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...