#include<bits/stdc++.h>
using namespace std;
const int maxN=(1e5)+5;
const int maxV=(1e7)+5;
const int inf=INT_MAX;
struct tip
{
int x,y,cost;
bool operator<(const tip& other)
{
return cost<other.cost;
}
};
int t[maxN];
inline int getRoot(int x)
{
//getting the root
int y=x;
while(t[y]>0) y=t[y];
//road compression
int z=y;
y=x;
while(y!=z)
{
int aux=t[y];
t[y]=z;
y=aux;
}
return y;
}
inline void unite(int x,int y)
{
int tx=getRoot(x);
int ty=getRoot(y);
if(tx<ty)
{
t[tx]+=t[ty];
t[ty]=tx;
}
else
{
t[ty]+=t[tx];
t[tx]=ty;
}
}
vector<tip> edges;
int n,v[maxN],cnt,M[maxV],nrm[maxN],x,y,cst,tx,ty;
long long sol;
inline int cost(int x,int y)
{
int xa,ya;
xa=M[x];
ya=M[y];
return min((xa%ya),(ya%xa));
}
int taken=0;
inline int bs1(int x)
{
int sol=0;
for(int step=(1<<20);step;step>>=1)
if((sol+step)<=n && v[sol+step]<=x) sol+=step;
return sol+1;
}
inline int bs2(int x)
{
int sol=0;
for(int step=(1<<20);step;step>>=1)
if((sol+step)<=n && v[sol+step]<x) sol+=step;
return sol+1;
}
int main()
{
//freopen("sirni.in","r",stdin);
//freopen("sirni.out","w",stdout);
scanf("%d",&n);
for(int i=1;i<=n;i++)
scanf("%d",&v[i]);
sort(v+1,v+n+1);
v[n+1]=inf;
for(int i=1;i<=n;i++)
{
if(i==1 || v[i]!=v[i-1]) cnt++;
M[cnt]=v[i];
nrm[i]=cnt;
}
for(int i=1;i<=cnt;i++)
{
int x=M[i];
if(x>=v[n]) continue;
int ind=bs1(x);
edges.push_back({i,nrm[ind],cost(i,nrm[ind])});
int lst=nrm[ind];
for(int j=x+x;j<=v[n];j+=x)
{
if(j>v[n]) continue;
ind=bs2(j);
if(nrm[ind]!=lst) edges.push_back({i,nrm[ind],cost(i,nrm[ind])});
lst=nrm[ind];
}
}
sort(edges.begin(),edges.end());
//for(auto it:edges)
// printf("%d %d% d\n",it.x,it.y,it.cost);
for(int i=1;i<=cnt;i++)
t[i]=-1;
for(auto it:edges)
{
if(taken==cnt-1) break;
x=it.x;
y=it.y;
cst=it.cost;
tx=getRoot(x);
ty=getRoot(y);
if(tx!=ty)
{
taken++;
sol+=1LL*cst;
unite(tx,ty);
}
}
printf("%lld\n",sol);
return 0;
}
Compilation message
sirni.cpp: In function 'int main()':
sirni.cpp:93:10: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
scanf("%d",&n);
~~~~~^~~~~~~~~
sirni.cpp:96:14: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
scanf("%d",&v[i]);
~~~~~^~~~~~~~~~~~
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Correct |
3 ms |
504 KB |
Output is correct |
2 |
Correct |
114 ms |
3560 KB |
Output is correct |
3 |
Correct |
5 ms |
632 KB |
Output is correct |
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Correct |
3 ms |
504 KB |
Output is correct |
2 |
Correct |
1461 ms |
1428 KB |
Output is correct |
3 |
Correct |
6 ms |
632 KB |
Output is correct |
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Correct |
3 ms |
504 KB |
Output is correct |
2 |
Correct |
2 ms |
376 KB |
Output is correct |
3 |
Correct |
3 ms |
504 KB |
Output is correct |
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Correct |
213 ms |
14544 KB |
Output is correct |
2 |
Correct |
716 ms |
51508 KB |
Output is correct |
3 |
Correct |
318 ms |
26876 KB |
Output is correct |
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Correct |
28 ms |
3816 KB |
Output is correct |
2 |
Correct |
360 ms |
51116 KB |
Output is correct |
3 |
Correct |
208 ms |
14632 KB |
Output is correct |
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Correct |
480 ms |
51508 KB |
Output is correct |
2 |
Correct |
982 ms |
100820 KB |
Output is correct |
3 |
Correct |
300 ms |
27020 KB |
Output is correct |
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Correct |
66 ms |
7264 KB |
Output is correct |
2 |
Correct |
905 ms |
100856 KB |
Output is correct |
3 |
Correct |
299 ms |
26976 KB |
Output is correct |
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Correct |
276 ms |
27096 KB |
Output is correct |
2 |
Correct |
4833 ms |
396416 KB |
Output is correct |
3 |
Correct |
328 ms |
27028 KB |
Output is correct |
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Correct |
296 ms |
26200 KB |
Output is correct |
2 |
Execution timed out |
5117 ms |
395800 KB |
Time limit exceeded |
3 |
Halted |
0 ms |
0 KB |
- |
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Correct |
37 ms |
3816 KB |
Output is correct |
2 |
Execution timed out |
5073 ms |
395668 KB |
Time limit exceeded |
3 |
Halted |
0 ms |
0 KB |
- |