#include <iostream>
#include <vector>
#include <algorithm>
#define ll long long
using namespace std;
vector<int> parent, ranks;
void make_set(int v) {
parent[v] = v;
ranks[v] = 0;
}
int find_set(int v) {
if (v == parent[v])
return v;
return parent[v] = find_set(parent[v]);
}
void union_sets(int a, int b) {
a = find_set(a);
b = find_set(b);
if (a != b) {
if (ranks[a] < ranks[b])
swap(a, b);
parent[b] = a;
if (ranks[a] == ranks[b])
ranks[a]++;
}
}
int main()
{
int n;
cin >> n;
vector<ll> a(n);
for (int i = 0; i < n; i++) cin >> a[i];
vector<pair<ll, pair<ll, ll> > > edges;
for (int i = 0; i < n; i++)
{
for (int j = i+1; j < n; j++)
{
edges.push_back(make_pair(min(a[i]%a[j], a[j]%a[i]), make_pair(i, j)));
}
}
int cost = 0;
parent.resize(n);
ranks.resize(n);
for (int i = 0; i < n; i++) make_set(i);
sort(edges.begin(), edges.end());
for (pair<ll, pair<ll, ll> > e : edges)
{
if (find_set(e.second.first) != find_set(e.second.second))
{
cost += e.first;
// result.push_back(e);
union_sets(e.second.first, e.second.second);
}
}
cout << cost << endl;
return 0;
}
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |