結果
| 問題 |
No.1917 LCMST
|
| コンテスト | |
| ユーザー |
inksamurai
|
| 提出日時 | 2022-04-30 21:28:02 |
| 言語 | C++17 (gcc 13.3.0 + boost 1.87.0) |
| 結果 |
AC
|
| 実行時間 | 421 ms / 4,000 ms |
| コード長 | 1,797 bytes |
| コンパイル時間 | 2,321 ms |
| コンパイル使用メモリ | 208,088 KB |
| 最終ジャッジ日時 | 2025-01-29 01:00:58 |
|
ジャッジサーバーID (参考情報) |
judge5 / judge1 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| sample | AC * 3 |
| other | AC * 42 |
ソースコード
#include <bits/stdc++.h>
using namespace std;
#define rep(i,n) for(int i=0;i<n;i++)
#define rng(i,x,n) for(int i=x;i<n;i++)
#define per(i,n) for(int i=n-1;i>=0;i--)
#define fi first
#define se second
#define pb push_back
#define sz(a) (int)a.size()
#define vec(...) vector<__VA_ARGS__>
#define _3k5NXAD ios::sync_with_stdio(0),cin.tie(0)
typedef long long ll;
using pii=pair<int,int>;
using vi=vector<int>;
void print(){cout<<'\n';}
template<class h,class...t>
void print(const h&v,const t&...u){cout<<v<<' ',print(u...);}
// e
struct dsu{
int n,cmps;
vector<int> par,siz;
dsu(int m){init(m);}
void init(int m){
n=m;
cmps=m;
par.resize(n,0);
siz.resize(n,0);
for(int i=0;i<n;i++){
par[i]=i;
siz[i]=1;
}
}
void merge(int v,int u){
v=parent(v),u=parent(u);
if(v==u)return;
if(siz[v]<siz[u])swap(v,u);
cmps-=1;
siz[v]+=siz[u];
par[u]=v;
}
int parent(int v){
return par[v]==v?v:parent(par[v]);
}
bool same(int v, int u){
return parent(v)==parent(u);
}
int size(int v=-1){
return (v==-1?cmps:siz[parent(v)]);
}
};
const int nax=100001;
vi rbts[nax];
signed main(){
_3k5NXAD;
int n;
cin>>n;
vi a(n);
rep(i,n){
cin>>a[i];
}
rep(i,n){
rbts[a[i]].pb(i);
}
using tup=tuple<ll,int,int>;
vec(tup) edges;
rng(i,1,nax){
int rt=-1,irt=-1;
for(int j=i;j<nax;j+=i){
if(sz(rbts[j])){
rt=j;
irt=rbts[j][0];
break;
}
}
if(rt==-1) continue;
for(int j=rt;j<nax;j+=i){
if(sz(rbts[j])) edges.pb({(1ll*rt*j)/i,rbts[j][0],irt});
}
}
sort(edges.begin(),edges.end());
dsu uf(n);
ll ans=0;
rep(i,nax){
for(auto &u:rbts[i]){
if(u==rbts[i][0]) continue;
ans+=i;
uf.merge(rbts[i][0],u);
}
}
for(auto &[cosu,u,v]:edges){
if(uf.same(u,v)) continue;
ans+=cosu;
uf.merge(u,v);
}
print(ans);
//
return 0;
}
inksamurai