Submission #1175204

#TimeUsernameProblemLanguageResultExecution timeMemory
1175204nuutsnoyntonSirni (COCI17_sirni)C++20
98 / 140
5113 ms399500 KiB
#include<bits/stdc++.h>

using namespace std;
using ll = int;
const ll N = 1e7 + 2;
ll a[100005];
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 ++;
	}
	vector < pair < ll, pair < ll, ll > > > v;

	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;
			if ( !v.empty() && v.back().second.second == r) {
				v.pop_back();
			}
			v.push_back(make_pair(a[r] - j, make_pair(i, r)));
		}
	}
	
	for (i = 1; i < n; i ++) {
		v.push_back(make_pair(a[i + 1] %a[i],make_pair(i , i + 1) ));
	}
	
	for (i = 1; i <= n; i ++) ataman[i] = i;
	ans = 0;
	sort(v.begin(), v.end());
	
	for (i = 0; i < v.size(); i ++) {
		x = v[i].second.first;
		y = v[i].second.second;
		x = Get(x);
		y = Get(y);
		if ( x != y) {
			Unite(x, y);
			ans += v[i].first;
		}
	}
	
	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...