This submission is migrated from previous version of oj.uz, which used different machine for grading. This submission may have different result if resubmitted.
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef long double ld;
#define pb push_back
#define pi pair<ll,ll>
#define F first
#define S second
#define all(x) (x).begin(), (x).end()
#define alll(x) ((x).begin()+1), (x).end()
#define clean(v) (v).resize(distance((v).begin(), unique(all(v))));
#define yes cout<<"Yes"<<endl;
#define no cout<<"No"<<endl;
#define mod mod
#define endl '\n'
mt19937 rng(chrono::steady_clock::now().time_since_epoch().count());
const ll mod = 998244353;
void io() {
ios::sync_with_stdio(false);
cin.tie(NULL);
}
template<class T>
bool ckmax(T &a, const T &b) { return a < b ? a = b, 1 : 0; }
template<class T>
bool ckmin(T &a, const T &b) { return a > b ? a = b, 1 : 0; }
void nop() {
cout << -1 << endl;
return;
}
struct DSU{
vector<int> dsu ;
void init(int n){dsu.resize(n+1) ; for(int i = 0 ; i<=n ; i++) dsu[i] = -1 ;}
int size_(int a){return -dsu[find_(a)] ;}
int find_(int a){return (dsu[a]<0 ? a:dsu[a]=find_(dsu[a])) ;}
void add_(int a , int b){
int x = find_(a) ;int y = find_(b) ;if(x==y) return ;
if(dsu[x]>dsu[y]) swap(x,y) ;
dsu[x] += dsu[y] ;
dsu[y] = x ;
}
};
void solve() {
int n ; cin>>n ;
vector<pair<int,int>> v ;
map<int,int> mp ;
int nax = 0 ;
for(int i = 1 ; i<=n ; i++){
int x ; cin>>x ;
ckmax(nax , x) ;
if(mp.count(x)) continue;
mp[x] = 1 ;
v.pb({x , i}) ;
}
++nax ;
vector<array<int,3>> edges ;
sort(all(v)) ;
for(int i = 0 ; i<v.size() ; i++){
if(i+1<v.size()){
edges.pb({v[i+1].F % v[i].F , v[i].S , v[i+1].S}) ;
}
for(int j = v[i].F + v[i].F ; j<nax ; j+=v[i].F){
auto it = lower_bound(all(v) , make_pair(j , -1)) ;
if(it!=v.end()){
edges.pb({it->F % v[i].F , v[i].S , it->S}) ;
}
}
}
DSU dsu ; dsu.init(n+5) ;
sort(all(edges)) ;
ll ans = 0 ;
for(auto a : edges){
int x = a[0] , u = a[1] , v = a[2] ;
if(dsu.find_(u) == dsu.find_(v)) continue;
ans+= x ;
dsu.add_(u , v) ;
}
cout<<ans<<endl;
}
int main() {
io();
ll tt = 1;
//cin>>tt ;
while (tt--) {
solve();
}
return 0;
}
Compilation message (stderr)
sirni.cpp: In function 'void solve()':
sirni.cpp:65:22: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<std::pair<int, int> >::size_type' {aka 'long unsigned int'} [-Wsign-compare]
65 | for(int i = 0 ; i<v.size() ; i++){
| ~^~~~~~~~~
sirni.cpp:66:15: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<std::pair<int, int> >::size_type' {aka 'long unsigned int'} [-Wsign-compare]
66 | if(i+1<v.size()){
| ~~~^~~~~~~~~
# | 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... |