Submission #1175207

#TimeUsernameProblemLanguageResultExecution timeMemory
1175207nuutsnoyntonSirni (COCI17_sirni)C++20
126 / 140
2885 ms786956 KiB
#include<bits/stdc++.h>

using namespace std;
using ll = int;
const ll N = 1e7 + 2;
ll a[100005];
vector < pair < ll, ll > > v[N];
ll ataman[100005];
ll Get(ll x) {
	if (x == ataman[x]) return x;
	return ataman[x] = Get(ataman[x]);
}

void Unite(ll x, ll y) {
	x = Get(x);
	y = Get(y);
	if ( x == y) return ;
	if ( x > y) swap(x, y);
	ataman[y] = x;
}

int main() {
	ll n, m, r, x, y, i, j, ans, t;

	cin >> n;
	
	set < ll > S;
	
	for (i = 1; i <= n; i ++) {
		cin >> x;
		S.insert(x);
	} 
	n = S.size(); 
	
	r = 1;
	for (ll X : S) {
		a[r] = X;
		r ++;
	}

	for (i = 1; i <= n; i ++) {
		for ( j = 2 * a[i]; j <= a[n]; j += a[i]) {
			r = lower_bound(a + 1, a + n + 1, j) - a;
			if ( r> n) break;
			v[a[r] - j].push_back(make_pair(i, r));
		}
	}
	
	
	for (i = 1; i < n; i ++) {
		v[a[i + 1] % a[i]].push_back(make_pair(i, i + 1));
	}
	
	for (i = 1; i <= n; i ++) ataman[i] = i;
	ans = 0;
	
	for (i = 0; i <= 1e7; i ++) {
		for ( pair < ll, ll >P : v[i]) {
			x = P.first;
			y = P.second;
			x = Get(x);
			y = Get(y);
			if ( x != y) {
				Unite(x, y);
				ans += i;
			}
		}
	}
	
	cout << ans << endl;
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...