제출 #136402

#제출 시각아이디문제언어결과실행 시간메모리
136402darkkcyanSirni (COCI17_sirni)C++14
112 / 140
5117 ms395232 KiB
#include <bits/stdc++.h> using namespace std; using namespace std::placeholders; // #define rand __rand // mt19937 rand(chrono::system_clock::now().time_since_epoch().count()); // or mt19937_64 #define llong long long #define xx first #define yy second #define len(x) ((int)x.size()) #define rep(i,n) for (int i = -1; ++ i < n; ) #define rep1(i,n) for (int i = 0; i ++ < n; ) #define all(x) x.begin(), x.end() template<class T> using min_priority_queue = priority_queue<T, vector<T>, greater<T>>; #define maxn 101010 int n; int a[maxn]; int dsu[maxn]; int n_set; int findp(int u) { return u == dsu[u] ? u : dsu[u] = findp(dsu[u]); } void join(int u, int v) { u = findp(u); v = findp(v); if (u == v) return ; if (rand() & 1) swap(u, v); dsu[u] = v; --n_set; } int main(void) { ios_base::sync_with_stdio(0); cin.tie(0); cout.tie(0); cin >> n; rep(i, n) cin >> a[i]; sort(a, a + n); n = (int)(unique(a, a + n) - a); min_priority_queue<tuple<int, int, int>> pq; rep(i, n) { for (int k = 1; k * a[i] <= a[n - 1]; ++k) { auto t = lower_bound(a, a + n, k * a[i]) - a; if (t != n and a[t] == a[i]) ++t; if (t == n) break; pq.push({a[t] % a[i], i, t}); k = a[t] / a[i]; } } // clog << "nice" << endl; n_set = n; rep1(i, n) dsu[i] = i; llong ans = 0; while (n_set != 1) { int cost, src, cur; tie(cost, src, cur) = pq.top(); pq.pop(); if (findp(src) != findp(cur)) { ans += cost; join(src, cur); } int div = a[cur] / a[src]; ++cur; if (cur == n or a[cur] / a[src] != div) continue; pq.push({a[cur] % a[src], src, cur}); } cout << ans; 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...