Submission #881896

#TimeUsernameProblemLanguageResultExecution timeMemory
881896MisterReaperSirni (COCI17_sirni)C++17
140 / 140
4351 ms396940 KiB
#include <bits/stdc++.h> using namespace std; using i64 = long long; const int MAX = 2E7; const int MAXN = 1E5 + 5; int par[MAXN]; struct DSU { int n; DSU(int n) : n(n) { iota(par, par + n, 0); } int get(int a) { return par[a] = (par[a] == a ? a : get(par[a])); } bool same(int a, int b) { return get(a) == get(b); } bool unite(int a, int b) { if(same(a, b)) { return false; } a = get(a), b = get(b); par[b] = a; return true; } }; int cost(int a, int b) { return min(a % b, b % a); } #define ONLINE_JUDGE void solve() { int n; cin >> n; vector <int> p(n); for(int &i : p) { cin >> i; } sort(p.begin(), p.end()); p.erase(unique(p.begin(), p.end()), p.end()); n = int(p.size()); using T = tuple <int, int, int>; vector <T> edges; for(int i = 0; i +1 < n; i++) { for(int j = p[i]; j <= MAX; j += p[i]) { int idx = lower_bound(p.begin() + i +1, p.end(), j) - p.begin(); if(idx == n) break; if(j <= p[idx] && p[idx] <= j + p[i]) { edges.emplace_back(i, idx, cost(p[i], p[idx])); } } } sort(edges.begin(), edges.end(), [&](const T &a, const T &b) -> bool { return get <2> (a) < get <2> (b); }); DSU dsu(n); i64 ans = 0; for(auto [u, v, c] : edges) { //cerr << u << " " << v << " " << c << "\n"; if(dsu.unite(u, v)) { ans += c; } } cout << ans; return; } signed main() { #ifndef ONLINE_JUDGE freopen("in.txt", "r", stdin); freopen("out.txt", "w", stdout); #endif ios_base::sync_with_stdio(false); cin.tie(NULL); cout.tie(NULL); int t = 1; //cin >> t; for(int i = 1; i <= t; i++) { solve(); } 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...