#pragma GCC optimize("Ofast,unroll-loops,fast-math,-ffloat-store")
#pragma GCC target("sse,sse2,sse3,ssse3,sse4,popcnt,abm,mmx,avx,avx2,fma")
#pragma GCC optimize("prefetch-loop-arrays,inline-functions,inline-small-functions,tree-loop-vectorize,tree-slp-vectorize,tree-loop-distribution")
#include <bits/stdc++.h>
using namespace std;
#ifdef _WIN32
#define getchar_unlocked _getchar_nolock
#endif
inline unsigned int readunsignedint(){
unsigned int c=getchar_unlocked(),x=0;
while(c<'0' or c>'9') c=getchar_unlocked();
for(;c>='0' and c<='9';c=getchar_unlocked())
x=(x<<3)+(x<<1)+(c-'0');
return x;
}
struct Edge{
unsigned int u,v;
unsigned int w;
Edge(unsigned int _u,unsigned int _v,unsigned 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[39000007];
struct DSU{
vector<unsigned int> par,rank;
DSU(unsigned int n):par(n+1),rank(n+1){}
void make_set(unsigned int u){
par[u]=u;
rank[u]=0;
}
unsigned int find_set(unsigned int v){return par[v]==v?v:find_set(par[v]);}
bool union_set(unsigned int u,unsigned 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;
}
};
unsigned int n;
vector<unsigned int> p;
unsigned int nxt[10000005],m=0;
main()
{
ios_base::sync_with_stdio(0);cin.tie(0);cout.tie(0);
n=readunsignedint();
p.resize(n);
for(unsigned int i=0;i<n;i++) p[i]=readunsignedint();
sort(p.begin(),p.end());
p.erase(unique(p.begin(),p.end()),p.end());
n=p.size();
for(unsigned int i=0;i<n-1;i++){
nxt[p[i]]=i;
for(unsigned int j=p[i]+1;j<p[i+1];j++) nxt[j]=i+1;
}
nxt[p[n-1]]=n-1;
unsigned int mx=p[n-1];
for(unsigned int i=0;i<n;i++){
e[++m]={i,nxt[p[i]+1],p[nxt[p[i]+1]]%p[i]};
for(unsigned int j=p[i];j<=mx;j+=p[i]){
e[++m]={i,nxt[j],p[nxt[j]]%p[i]};
j=p[nxt[j]]/p[i]*p[i];
}
}
//-----------------------------------------
sort(e+1,e+1+m);
DSU d(n);
for(unsigned int i=1;i<=n;i++) d.make_set(i);
unsigned int total=0;
unsigned int dem=0;
for(unsigned 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;
}
Compilation message (stderr)
sirni.cpp:46:1: warning: ISO C++ forbids declaration of 'main' with no type [-Wreturn-type]
46 | main()
| ^~~~
# | 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... |