Submission #1065212

#TimeUsernameProblemLanguageResultExecution timeMemory
1065212ezGeometrySirni (COCI17_sirni)C++14
84 / 140
809 ms786432 KiB
#include <iostream> #include <vector> #include <set> #include <algorithm> #include <tuple> #include <queue> 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; int cur = 0; vector<int> nextL(mp + 1); int curIt = 0; for (int c : q) { p.push_back(c); while (cur != mp + 1 && c >= cur) { nextL[cur] = curIt; cur++; } curIt++; } 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]; if (j != n - 1) { edges.push_back(make_tuple(p[j + 1] % c, j, j + 1)); } for (int i = 2; i <= mp / c; i ++) { edges.push_back(make_tuple(p[nextL[i * c]] % c, j, nextL[i * c])); } } 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...