Submission #1065194

#TimeUsernameProblemLanguageResultExecution timeMemory
1065194ezGeometrySirni (COCI17_sirni)C++14
84 / 140
2113 ms786432 KiB
#include <iostream> #include <vector> #include <set> #include <algorithm> #include <tuple> using namespace std; using ll = long long; int n; vector<int> parent, sizes; int cc; void init() { parent.resize(n); sizes.resize(n); cc = n; for (int i = 0; i < n; i++) { parent[i] = i; sizes[i] = 1; } } int find_set(int a) { if (parent[a] == a) { return a; } return parent[a] = find_set(parent[a]); } void join_set(int a, int b) { a = find_set(a); b = find_set(b); if (a == b) { return; } if (sizes[a] > sizes[b]) { swap(a, b); } cc--; parent[a] = b; sizes[b] += sizes[a]; } int main() { cin >> n; set<int> q; int mp = 0; for (int i = 0; i < n; i++) { int x; cin >> x; q.insert(x); mp = max(mp, x); } vector<int> p; for (int c : q) { p.push_back(c); } n = p.size(); // Kruskal's Algorithm for MST vector<tuple<int, int, int>> edges; // It is optimal to go from c to lower_bound(ck) and then from ck to ck+m for (int j = 0; j < n; j++) { int c = p[j]; auto it1 = upper_bound(p.begin(), p.end(), c); // it1 is essentially p.begin() + (j + 1) if (it1 != p.end()) { edges.push_back(make_tuple(*it1 % c, j, it1 - p.begin())); } /*if (j != n - 1) { edges.push_back(make_tuple(p[j + 1] % c, j, j + 1)); }*/ for (int i = 2 * c; i <= mp; i += c) { auto it = lower_bound(p.begin(), p.end(), i); edges.push_back(make_tuple(*it % c, j, it - p.begin())); } } sort(edges.begin(), edges.end()); ll ans = 0; init(); for (auto c : edges) { ll w, a, b; tie(w, a, b) = c; if (find_set(a) == find_set(b)) { continue; } join_set(a, b); ans += w; if (cc == 1) { break; } } cout << ans << endl; 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...