Submission #1245852

#TimeUsernameProblemLanguageResultExecution timeMemory
1245852khoiSirni (COCI17_sirni)C++20
0 / 140
27 ms5604 KiB
#include <bits/stdc++.h> using namespace std; struct Edge { int u, v; long long w; bool operator<(Edge const& o) const { return w < o.w; } }; struct DSU { vector<int> par, rank; DSU(int n): par(n+1), rank(n+1, 0) {} void make_set(int u) { par[u] = u; rank[u] = 0; } int find_set(int v) { return par[v] == v ? v : par[v] = find_set(par[v]); } bool union_set(int u, int v) { u = find_set(u); v = find_set(v); if (u == v) return false; if (rank[u] < rank[v]) swap(u, v); par[v] = u; if (rank[u] == rank[v]) rank[u]++; return true; } }; int n, p[100005]; vector<Edge> e; int main() { ios_base::sync_with_stdio(0); cin.tie(0); cout.tie(0); cin >> n; for (int i = 1; i <= n; i++) cin >> p[i]; // Tìm chỉ số có giá trị nhỏ nhất int idx = 1; for (int i = 2; i <= n; i++) { if (p[i] < p[idx]) idx = i; } // Thêm các cạnh từ các đỉnh khác đến đỉnh nhỏ nhất for (int i = 1; i <= n; i++) { if (i == idx) continue; int w = min(p[i] % p[idx], p[idx] % p[i]); e.push_back({idx, i, w}); } // Thêm cạnh giữa các phần tử gần nhau (kề nhau khi sort) vector<pair<int, int>> v(n); for (int i = 1; i <= n; i++) { v[i-1] = {p[i], i}; // value, index } sort(v.begin(), v.end()); for (int i = 1; i < n; i++) { int a = v[i-1].second; int b = v[i].second; int w = min(p[a] % p[b], p[b] % p[a]); e.push_back({a, b, w}); } sort(e.begin(), e.end()); DSU d(n); for (int i = 1; i <= n; i++) d.make_set(i); long long total = 0; int count = 0; for (auto [u, v, w] : e) { if (d.union_set(u, v)) { total += w; if (++count == n - 1) break; } } cout << total << '\n'; }
#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...