Submission #1139302

#TimeUsernameProblemLanguageResultExecution timeMemory
1139302ChottuFSirni (COCI17_sirni)C++20
0 / 140
82 ms15800 KiB
#include <bits/stdc++.h>
using namespace std;

struct DSU {
    vector<int> parent, min_val;
    DSU(int n, const vector<int>& arr) {
        parent.resize(n);
        min_val.resize(n);
        for (int i = 0; i < n; ++i) {
            parent[i] = i;
            min_val[i] = arr[i];
        }
    }
    
    int find(int x) {
        if (parent[x] != x) {
            parent[x] = find(parent[x]);
        }
        return parent[x];
    }
    
    void merge(int a, int b) {
        a = find(a);
        b = find(b);
        if (a == b) return;
        if (min_val[a] < min_val[b]) {
            parent[b] = a;
        } else {
            parent[a] = b;
        }
    }
    
    int get_min(int x) {
        return min_val[find(x)];
    }
};

int main() {
    ios_base::sync_with_stdio(false);
    cin.tie(nullptr);
    
    int n;
    cin >> n;
    vector<int> arr(n);
    for (int i = 0; i < n; ++i) {
        cin >> arr[i];
    }
    
    if (n == 1) {
        cout << 0 << '\n';
        return 0;
    }
    
    sort(arr.begin(), arr.end());
    int m = arr[0];
    if (m == 1) {
        cout << 0 << '\n';
        return 0;
    }
    
    DSU dsu(n, arr);
    unordered_map<int, vector<int>> value_indices;
    for (int i = 0; i < n; ++i) {
        value_indices[arr[i]].push_back(i);
    }
    
    int max_val = arr.back();
    vector<int> unique_values;
    for (int i = 0; i < n; ++i) {
        if (i == 0 || arr[i] != arr[i-1]) {
            unique_values.push_back(arr[i]);
        }
    }
    
    for (int x : unique_values) {
        vector<int>& indices = value_indices[x];
        if (indices.empty()) continue;
        int root = indices[0];
        for (size_t i = 1; i < indices.size(); ++i) {
            dsu.merge(root, indices[i]);
        }
        
        for (long long k = 2; ; ++k) {
            long long y = (long long)x * k;
            if (y > max_val) break;
            if (value_indices.find(y) != value_indices.end()) {
                vector<int>& y_indices = value_indices[y];
                if (y_indices.empty()) continue;
                dsu.merge(root, y_indices[0]);
            }
        }
    }
    
    int m_root = dsu.find(0);
    unordered_set<int> components;
    for (int i = 0; i < n; ++i) {
        components.insert(dsu.find(i));
    }
    
    int total = 0;
    for (int root : components) {
        if (dsu.find(root) == dsu.find(m_root)) continue;
        int current_min = dsu.get_min(root);
        total += current_min % m;
    }
    
    cout << total << '\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...