Submission #667509

#TimeUsernameProblemLanguageResultExecution timeMemory
667509tanprodiumSirni (COCI17_sirni)C++14
126 / 140
5025 ms435536 KiB
#include<bits/stdc++.h> using namespace std; using ll = long long; struct Edge { int u, v, w; Edge() {} Edge(int _u, int _v, int _w): u(_u), v(_v), w(_w) {} bool operator < (const Edge &other) const { return (w < other.w); } }; const int N = 1e5; const int V = 1e7; vector<Edge> e; int a[N + 5]; int par[N + 5]; int id[V + 5]; vector<int> cpr; int getpar(int u) { while (par[u] > 0) u = par[u]; return (u); } bool uni(int u, int v) { u = getpar(u), v = getpar(v); if (u == v) return (false); if (par[u] > par[v]) swap(u, v); par[u] += par[v]; par[v] = u; return (true); } void solve() { int n; cin >> n; for (int i = 1; i <= n; i++) { cin >> a[i]; cpr.push_back(a[i]); } sort(cpr.begin(), cpr.end()); cpr.resize(unique(cpr.begin(), cpr.end()) - cpr.begin()); n = (int)cpr.size(); vector<int> vec; for (int i = 1; i <= n; i++) { par[i] = -1; a[i] = cpr[i - 1]; id[a[i]] = i; vec.push_back(a[i]); } for (int i = 1; i <= n; i++) { int val = a[i]; int d = 1; while (true) { int take = max(val + 1, val * d);; auto iter = lower_bound(vec.begin(), vec.end(), take); if (iter == vec.end()) break; int nval = *iter; int j = id[nval]; int dist = nval % val; e.emplace_back(i, j, dist); d = nval / val + 1; } } sort(e.begin(), e.end()); int sz = (int)e.size(); ll ans = 0; for (int i = 0; i < sz; i++) { int u = e[i].u, v = e[i].v, w = e[i].w; //cout << u << ' ' << v << ' ' << w << '\n'; if (uni(u, v)) ans += 1ll * w; } cout << ans; } int main() { ios_base::sync_with_stdio(false); cin.tie(0); cout.tie(0); solve(); 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...