Submission #1165346

#TimeUsernameProblemLanguageResultExecution timeMemory
1165346chiqouz7Sirni (COCI17_sirni)C++20
98 / 140
1492 ms851968 KiB
#include <bits/stdc++.h>
using namespace std;
#define f first
#define s second
#define ll long long
const ll N = 2e5 + 5;
const ll M = 1e7 + 5;
ll p[N+1] = {};
ll sz[N+1] = {};
ll find(ll a){
	if(a == p[a]) return a;
	return p[a] = find(p[a]);
}
void unite(ll a, ll b){
	if(a != b){
		if(sz[a] < sz[b]) swap(a, b);
		p[b] = a;
		if(sz[a] == sz[b]) sz[a]++;
	}
}
int main() {
	ll n;
	cin>>n;
	vector<ll> v(n);
	ll close[M] = {};
	ll index[M] = {};
	ll mas[M] = {};
	memset(index, -1, sizeof index);
	for(ll i = 0; i < n; i++){
		p[i] = i;
		sz[i] = 0;
		cin>>v[i];
		close[v[i]] = v[i];
		if(index[v[i]] == -1) index[v[i]] = i;
	}
	for(ll i = M-2; i >= 0; i--){
		if(!close[i]) close[i] = close[i+1];
	}
	vector<vector<pair<ll, ll> > > e(M);
	for(ll i = 0; i < n; i++){
		if(mas[v[i]]++) continue;
		if(close[v[i]+1]){
			if(2*v[i] >= M || close[2*v[i]] != close[v[i]+1]){
				e[close[v[i]+1] - v[i]].push_back({i, index[close[v[i]+1]]});
			}
		}
		for(ll j = 2*v[i]; j < M && close[j]; j+=v[i]){
			ll x = close[j];
			if(j+v[i] >= M || close[j+v[i]] != x){
				 e[x - j].push_back({i, index[x]});
			}
		}
	}
	ll ans = 0;
	for(ll i = 0; i < M; i++){
		for(ll j = 0; j < e[i].size(); j++){
			ll a = find(e[i][j].f);
			ll 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...