제출 #668480

#제출 시각아이디문제언어결과실행 시간메모리
668480DoxenoSirni (COCI17_sirni)C++17
28 / 140
5122 ms786432 KiB
#include <bits/stdc++.h> #include <functional> #include <numeric> using namespace std; int main(){ int N; cin >> N; set<int> s; int a; for(int i = 0; i < N; ++i){ cin >> a; s.insert(-a); } N = s.size(); vector<int> v; for(auto x: s)v.emplace_back(-x); int m = 1e7 + 2; vector<vector<int>> p(m); for(int j = 0; j < N; ++j){ for(int i = v[j]; i < m; i += v[j]){ p[i].push_back(j); } } int c = v[0]; long long ans = 0; vector<array<int,3>> eg; for(int i = 0; i < N; ++i){ auto x = v[i]; while(c > x){ --c; for(auto j: p[c]){ eg.push_back({v[i-1]-c, j, i-1}); } } if(c == x && p[x].size() == 1)--c; while(c > 0 && p[c].empty())--c; for(auto j: p[c]){ eg.push_back({x-c, i, j}); } } vector<int> dad(N), sz(N, 0); iota(dad.begin(), dad.end(), 0); function<int(int)> find=[&](int a){ if(dad[a] != a)dad[a] = find(dad[a]); return dad[a]; }; auto uni = [&](int a, int b) -> bool{ a = find(a); b = find(b); if(a == b)return 0; if(sz[a] < sz[b])swap(a,b); dad[b] = a; sz[a] += sz[b]; return 1; }; sort(eg.begin(), eg.end()); for(auto [w, i, j]: eg){ if(uni(i, j))ans += w; } cout << ans << endl; 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...