Submission #1092867

#TimeUsernameProblemLanguageResultExecution timeMemory
1092867vjudge1Sirni (COCI17_sirni)C++14
14 / 140
900 ms190788 KiB
#include <bits/stdc++.h> using namespace std; int n; int a[100005]; struct pi { int w, u, v; }; bool cmp(pi a, pi b) { if (a.w <= b.w) return true; return false; } int par[100005]; int fid(int x) { if (par[x] == x) return x; return par[x] = fid(par[x]); } void make_pair(int x, int y) { int u = fid(x); int v = fid(y); if (u == v) return; if (u < v) swap(u, v); par[u] = v; } vector<pi> v; int mp[10000007], nxt[10000007]; int main() { ios::sync_with_stdio(0); cin.tie(0); cin >> n; for (int i = 1; i <= n; i++) cin >> a[i]; for (int i = 1; i <= n; i++) par[i] = i; sort(a + 1, a + n + 1); for (int i = 1; i <= n; i++) mp[a[i]] = i; int k = -1; for (int i = 10000002; i >= 0; i--) { if (mp[i] != 0) k = mp[i]; nxt[i] = k; } for (int i = 1; i <= n; i++) { k = 1; while (a[i] * k <= 10000000) { int x = nxt[a[i] * k]; if (x == i) { x++; if (x == n + 1) x = -1; } if (x == -1) break; v.push_back({a[x] % a[i], i, x}); k = a[x] / a[i] + 1; // cout << i << " " << x << " " << a[x] % a[i] << '\n'; } } sort(v.begin(), v.end(), cmp); int ans = 0; for (auto x : v) { if (fid(x.u) == fid(x.v)) continue; make_pair(x.u, x.v); ans += x.w; } cout << ans; }
#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...