Submission #949169

#TimeUsernameProblemLanguageResultExecution timeMemory
949169vjudge1Sirni (COCI17_sirni)C++17
42 / 140
596 ms786432 KiB
#include <bits/stdc++.h>
using namespace std;
#define int long long
#define all(x) x.begin(), x.end()
#define size(x) (int)x.size()

template<class S, class T>
bool chmin(S& a, const T& b) {
	return a > b ? (a = b) == b : false;
}
template<class S, class T>
bool chmax(S& a, const T& b) {
	return a < b ? (a = b) == b : false;
}

struct DSU {
  vector<int> p;
  DSU(int n) {
    p.resize(n);
    iota(all(p), 0ll);
  }
  int find_set(int v) {
    return p[v] == v ? v : p[v] = find_set(p[v]);
  }
  void unite(int u, int v) {
    p[u] = v;
  }
};

signed main() {
  cin.tie(nullptr)->sync_with_stdio(false);
  int n; cin >> n;
  int a[n];
  for (int i = 0; i < n; ++i) {
    cin >> a[i];
  }
  DSU g(n);
  vector<array<int, 3>> edge;
  for (int i = 0; i < n; ++i) {
    for (int j = i + 1; j < n; ++j) {
      edge.push_back({min(a[i] % a[j], a[j] % a[i]), i, j});
    }
  }
  sort(all(edge));
  int res = 0;
  for (auto [c, a, b] : edge) {
    a = g.find_set(a), b = g.find_set(b);
    if (a == b) continue;
    g.unite(a, b);
    res += c;
  }
  cout << res;
}
#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...