Submission #1018427

#TimeUsernameProblemLanguageResultExecution timeMemory
1018427GentleRageSirni (COCI17_sirni)C++17
140 / 140
1006 ms747496 KiB
/*
 * tdiiy69
*/
#include<iostream>
#include<algorithm>
#include<cstring>
#include<vector>
using namespace std;
 
#define err(N) cerr << #N << " = " << N << '\n';
#define err1(A, N) cerr << #A << " = [";\
	for(int i = 1; i <= N; i++) { cerr << A[i]; if(i < N) cerr << ", "; } cerr << "]\n";
#define err0(A, N) cerr << #A << " = [";\
	for(int i = 0; i < N; i++) { cerr << A[i]; if(i < N - 1) cerr << ", "; } cerr << "]\n";
 
const int INF = 2e9 + 7;
const long long INFLL = 2e18 + 7;
const int N = 1e5 + 5;
const int V = 1e7 + 5;
 
struct DSU { // Disjoint Sets Union
	DSU(int _n) : lab(_n + 5, - 1) {}
 
	int root(int u) {
		return lab[u] < 0 ? u : lab[u] = root(lab[u]);
	}
 
	bool unite(int u, int v) {
		u = root(u); v = root(v);
		if(u == v) return false;
		if(lab[u] > lab[v]) swap(u, v);
		lab[u] += lab[v];
		lab[v] = u;
		return true;
	}
 
	int size(int u) {
		return -lab[root(u)];
	}
 
	private:
	vector<int> lab;
};
 
vector<pair<int, int>> need[V];
int a[N], nxt[V];
 
signed main() {
	ios_base::sync_with_stdio(0);
	cin.tie(0);
	int n; cin >> n;
	int maxi = 0;
	for(int i = 0; i < n; i++) {
		cin >> a[i];
		maxi = max(maxi, a[i]);
	}
	sort(a, a + n);
	n = unique(a, a + n) - a;
	memset(nxt, -1, sizeof nxt);
	for(int i = 0; i < n; i++) {
		nxt[a[i]] = i;
	}
	for(int v = maxi - 1; v >= 0; v--) {
		if(nxt[v] == -1) nxt[v] = nxt[v + 1];
	}
	for(int i = 0; i < n - 1; i++) {
		need[a[i + 1] % a[i]].push_back({i + 1, i});
		for(int j = a[i]; j <= maxi; j += a[i]) {
			need[a[nxt[j]] % a[i]].push_back({nxt[j], i});
		}
	}
	DSU dsu(n);
	long long ans = 0;
	for(int i = 0; i < maxi; i++) {
		for(const auto &[u, v] : need[i]) {
			if(dsu.unite(u, v)) ans += i;
		}
	}
	cout << ans;
	return (0 ^ 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...