Submission #1057731

#TimeUsernameProblemLanguageResultExecution timeMemory
1057731kitetrietrieSirni (COCI17_sirni)C++14
56 / 140
338 ms130852 KiB
#include<bits/stdc++.h> using namespace std; const int N = 1e6 + 5; const int nmax = 1e7 + 1; using ll = long long; int n; vector<int> g[N]; vector<int> v; int root[nmax + 5]; int nxt[nmax + 5]; struct tt{ int x; int y; int z; }; vector<tt> edge; bool cmp(tt x, tt y){ return x.z < y.z; } inline int find(int u) { return (u == root[u] ? u : root[u] = find(root[u])); } signed main(){ cin>>n; for(int i = 1 , x ; i <= n ; ++i){ cin>>x; v.push_back(x); g[x].push_back(i); } sort(v.begin(),v.end()); v.erase(unique(v.begin(),v.end()),v.end()); int j = 0; for(int i = 1 ; i <= v.back() ; ++i){ while(i > v[j] ) j++; nxt[i] = v[j]; } for (int x : v) for (int y = x; y <= v.back(); y += x) { int p = nxt[(y==x?y+1:y)]; if (!p) break; if (y + x < p) y = (p - y) / x * x + y; edge.push_back({x, p, p - y}); } for(auto i : v) root[i] = i; sort(edge.begin(),edge.end(),cmp); ll ans = 0; for (tt ee : edge) { int u = ee.x, v = ee.y, c = ee.z; //cout<<u<<'.'<<v<<'.'<<c<<"\n"; u = find(u), v = find(v); if (u != v) { root[u] = v; ans += 1ll*c; } } 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...