제출 #991074

#제출 시각아이디문제언어결과실행 시간메모리
991074BF001Sirni (COCI17_sirni)C++17
140 / 140
1024 ms749032 KiB
#include <bits/stdc++.h> using namespace std; #define N 100005 #define se second #define fi first int n, par[N]; long long res = 0; vector<int> p; struct ii { int u, v, w; bool operator < (ii o){ return w < o.w; } }; int find(int u){ if (u == par[u]) return u; return par[u] = find(par[u]); } void unin(int u, int v, int w){ u = find(u); v = find(v); if (u == v) return; par[u] = v; res += w; } void sub1(){ for (int i = 0; i < n; i++) par[i] = i; vector<ii> eg; for (int i = 0; i < n; i++){ for (int j = 0; j < n; j++){ if (i == j) continue; eg.push_back({i, j, p[j] % p[i]}); } } sort(eg.begin(), eg.end()); for (auto x : eg){ unin(x.u, x.v, x.w); } cout << res; } signed main(){ ios_base::sync_with_stdio(0); cin.tie(NULL); cin >> n; for (int i = 1; i <= n; i++){ int val; cin >> val; p.push_back(val); } if (n <= 1000){ sub1(); return 0; } sort(p.begin(), p.end()); p.resize(unique(p.begin(), p.end()) - p.begin()); int ma = p.back(); vector<int> near(ma + 1, -1); vector<vector<pair<int, int>>> eg(ma + 1); for (int i = 0; i < (int) p.size(); i++){ par[i] = i; near[p[i]] = i; } for (int i = ma - 1; i >= 0; i--){ if (near[i] == -1) near[i] = near[i + 1]; } for (int i = 0; i < (int) p.size(); i++){ eg[(p[i + 1] % p[i])].push_back({i, i + 1}); for (int j = 2 * p[i]; j <= ma; j += p[i]){ int pos = near[j]; if (pos == -1) continue; eg[(p[pos] % p[i])].push_back({i, pos}); } } for (int i = 0; i <= ma; i++){ for (auto x : eg[i]){ unin(x.fi, x.se, i); } } cout << res; 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...