#include <bits/stdc++.h>
using namespace std;
class DisjointSet{
private:
vector<int> parents;
vector<int> sizes;
public:
DisjointSet(int size) : parents(size), sizes(size, 1) {
for (int i = 0; i < size; i++) parents[i] = i;
}
int find(int x) {return parents[x] == x ? x : parents[x] = find(parents[x]);}
bool unite(pair<int, int> edge){
int x_root = find(edge.first);
int y_root = find(edge.second);
if (x_root == y_root) return false;
if (sizes[x_root] < sizes[y_root]) swap(x_root, y_root);
parents[y_root] = x_root;
sizes[x_root] += sizes[y_root];
return true;
}
};
int main(){
ios::sync_with_stdio(false);
cin.tie(nullptr);
cout.tie(nullptr);
int card_num;
cin >> card_num;
vector<int> card(card_num);
for (int i = 0; i < card_num; i++) cin >> card[i];
sort(card.begin(), card.end());
card.erase(unique(card.begin(), card.end()), card.end());
int largest = card.back();
vector<int> next_largest(largest + 1, -1);
for (int i = 0; i < (int)card.size(); i++) next_largest[card[i]] = i;
for (int i = largest - 1; i >= 0; i--) if (next_largest[i] == -1) next_largest[i] = next_largest[i + 1];
vector<vector<pair<int, int>>> good_links(largest + 1);
for (int i = 0; i < (int)card.size() - 1; i++){
good_links[card[i + 1] % card[i]].push_back({i, i + 1});
for (int at = 2 * card[i]; at <= largest; at += card[i]){
int good_mod = next_largest[at];
good_links[card[good_mod] % card[i]].push_back({i, good_mod});
}
}
long long ans = 0;
DisjointSet dsu((int)card.size());
for (int cost = 0; cost <= largest; cost++){
for (const pair<int, int> &link : good_links[cost]){
if (dsu.unite(link)){
ans += cost;
}
}
}
cout << ans;
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... |