Submission #1164928

#TimeUsernameProblemLanguageResultExecution timeMemory
1164928chiqouz7Sirni (COCI17_sirni)C++20
0 / 140
270 ms248304 KiB
#include <bits/stdc++.h>
using namespace std;
#define f first
#define s second
#define ll long long
const int N = 1e5;
int p[N+1] = {};
int sz[N+1] = {};
int find(int a){
	if(a == p[a]) return a;
	return p[a] = find(p[a]);
}
void unite(int a, int b){
	if(a != b){
		if(sz[a] < sz[b]) swap(a, b);
		p[b] = a;
		sz[a] += sz[b];
	}
}
int main() {
	int n;
	cin>>n;
	vector<int> v(n);
	int m = 0;
	for(int i = 0; i < n; i++){
		p[i] = i;
		sz[i] = 1;
		cin>>v[i];
		m = max(m, v[i]);
	}
	sort(v.begin(), v.end());
	vector<vector<pair<int, int> > > e(m);
	for(int i = 0; i < n; i++){
		for(int j = v[i]; j <= m; j+=v[i]){
			int x = j;
			auto it = lower_bound(v.begin(), v.end(), x);
			int ind = it-v.begin();
			if(j == 1) ind++;
			if(ind < n && v[ind] < (x+v[i])) e[v[ind]-x].push_back({i, ind});
			// if(j == 1) 
		}
	}
	ll ans = 0;
	for(int i = 0; i < m; i++){
		for(int j = 0; j < e[i].size(); j++){
			int a = find(e[i][j].f);
			int b = find(e[i][j].s);
			if(a != b){
				unite(a,b);
				ans += i;
			}
		}
	}
	cout<<ans;
	return 0;
}
#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...