#include <bits/stdc++.h>
using namespace std;
#define f first
#define s second
#define ll long long
const int N = 1e5;
int p[N+1] = {};
int sz[N+1] = {};
int find(int a){
if(a == p[a]) return a;
return p[a] = find(p[a]);
}
void unite(int a, int b){
if(a != b){
if(sz[a] < sz[b]) swap(a, b);
p[b] = a;
sz[a] += sz[b];
}
}
int main() {
int n;
cin>>n;
vector<int> v(n);
int m = 0;
for(int i = 0; i < n; i++){
p[i] = i;
sz[i] = 1;
cin>>v[i];
m = max(m, v[i]);
}
sort(v.begin(), v.end());
vector<pair<int, pair<int, int> > > edge;
vector<pair<int, pair<int, int> > > edges;
for(int i = 0; i < n; i++){
for(int j = 1; j*v[i] <= m; j++){
int x = j*v[i];
auto it = lower_bound(v.begin(), v.end(), x);
int ind = it-v.begin();
if(j == 1) ind++;
if(ind < n && v[ind] < (x+v[i])) edge.push_back({v[ind]-x, {i, ind}});
// if(j == 1)
}
}
vector<vector<pair<int, int> > > e(m);
for(int i = 0; i < edge.size(); i++){
e[edge[i].f].push_back(edge[i].s);
}
ll ans = 0;
for(int i = 0; i < m; i++){
for(int j = 0; j < e[i].size(); j++){
int a = find(e[i][j].f);
int b = find(e[i][j].s);
if(a != b){
unite(a,b);
ans += i;
}
}
}
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... |