#include <bits/stdc++.h>
using namespace std;
struct Edge{
int u,v;
int w;
Edge(int _u,int _v,int _w):u(_u),v(_v),w(_w){}
Edge():u(0),v(0),w(0){}
bool operator<(Edge const& o)const{return w<o.w;}
} e[20000007];
int m=0;
struct DSU{
vector<int> par,rank;
DSU(int n):par(n+1),rank(n+1){}
void make_set(int u){
par[u]=u;
rank[u]=0;
}
int find_set(int v){return par[v]==v?v:find_set(par[v]);}
bool union_set(int u,int v){
u=find_set(u);
v=find_set(v);
if(u!=v){
if(rank[u]<rank[v]) swap(u,v);
par[v]=u;
if(rank[u]==rank[v]) rank[u]++;
return 1;
}
else return 0;
}
};
int n,p[100005];
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];
sort(p+1,p+1+n);
int mx=*max_element(p+1,p+1+n);
for(int i=1;i<=n;i++){
for(int j=p[i];j<=mx;j+=p[i]){
auto it=lower_bound(p+i+1,p+n+1,j);
if(it==p+n+1) break;
int j1=it-p;
e[++m]={i,j1,p[j1]-j};
}
}
//-----------------------------------------
sort(e+1,e+1+m);
DSU d(n);
for(int i=1;i<=n;i++) d.make_set(i);
int total=0;
int dem=0;
for(int i=1;i<=m;i++){
auto [u,v,w]=e[i];
if(d.union_set(u,v)){
total+=w;
if(++dem==n-1) break;
}
}
cout<<total;
}
# | 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... |