Submission #1245921

#TimeUsernameProblemLanguageResultExecution timeMemory
1245921kaizisntmeSirni (COCI17_sirni)C++20
112 / 140
5105 ms412500 KiB
#include <bits/stdc++.h> using namespace std; struct Edge { int u, v, w; Edge() {} Edge(int u, int v, int Weight) : u(u), v(v), w(Weight) {} bool inline operator<(const Edge &other) const { return w < other.w; } }; const int MAXN = 1e5; const int MAXP = 1e7; int n, nxt[MAXP + 5], par[MAXN + 5], cnt = 0; vector<int> p; Edge Ed[60000007]; int fnd(int u) { return u == par[u] ? u : par[u] = fnd(par[u]); } bool merge(int u, int v) { u = fnd(u), v = fnd(v); if (u == v) return false; par[v] = u; return true; } int main() { cin.tie(0)->ios::sync_with_stdio(0); cin >> n; for (int i = 0; i < n; i++) { int x; cin >> x; p.push_back(x); } sort(p.begin(), p.end()); p.erase(unique(p.begin(), p.end()), p.end()); n = p.size(); for (int i = 0; i < n - 1; i++) { nxt[p[i]] = i; for (int j = p[i] + 1; j < p[i + 1]; j++) nxt[j] = i + 1; } nxt[p[n - 1]] = n - 1; for (int i = 0; i < n; i++) { Ed[cnt++] = Edge(i, nxt[p[i] + 1], p[nxt[p[i] + 1]] % p[i]); for (int mul = 2 * p[i]; mul <= p[n - 1]; mul += p[i]) { Ed[cnt++] = Edge(i, nxt[mul], p[nxt[mul]] % p[i]); mul = p[nxt[mul]] / p[i] * p[i]; } } sort(Ed, Ed + cnt); for (int i = 0; i < n; i++) par[i] = i; int Ans = 0; for (auto &c : Ed) if (merge(c.u, c.v)) Ans += c.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...