Submission #1198780

#TimeUsernameProblemLanguageResultExecution timeMemory
1198780dwuySirni (COCI17_sirni)C++20
0 / 140
4778 ms851968 KiB
#include <bits/stdc++.h> using namespace std; typedef long long ll; const int MX = 100005; const int MV = 10000005; struct DSU{ int n; vector<int> e; DSU(int n = 0) : n(n), e(n + 5, -1) {} int fp(int u){ return e[u] < 0? u : e[u] = fp(e[u]); } bool unon(int u, int v){ u = fp(u); v = fp(v); if(u == v) return 0; if(e[u] > e[v]) swap(u, v); e[u] += e[v]; e[v] = u; return 1; } }; int n; int a[MX]; int sum[MV]; int32_t main(){ ios_base::sync_with_stdio(false); cin.tie(0); cin >> n; for(int i=1; i<=n; i++) cin >> a[i]; sort(a + 1, a + 1 + n); DSU dsu(n); int cc = n - 1; for(int i=1; i<=n; i++){ sum[a[i]] = 1; if(a[i] == a[i - 1]) cc -= dsu.unon(i, i - 1); } for(int i=1; i<MV; i++) sum[i] += sum[i-1]; int lim = 0; for(int lo=0, hi=1e7; lo<=hi;){ int mid = (lo + hi)>>1; int cnt = 0; for(int i=1; i<=n; i++) if(a[i] != a[i-1]){ for(int j=a[i]; j<MV; j+=a[i]){ int r = min({MV - 1, j + a[i] - 1, j + mid}); cnt += sum[r] - sum[j-1]; } cnt--; } if(cnt >= cc) lim = mid, hi = mid - 1; else lo = mid + 1; } vector<pair<int, pair<int, int>>> edges; for(int i=1; i<=n; i++){ for(int j=a[i], t=i; t<=n; j+=a[i]){ if(t<=n && a[t] < j) t = upper_bound(a + t + 1, a + n + 1, j) - a; while(t <= n && a[t] <= j + min(a[i] - 1, lim)){ edges.push_back({a[t]%a[i], {i, t}}); t++; } } } int ans = 0; sort(edges.begin(), edges.end()); for(pair<int, pair<int, int>> e: edges){ if(dsu.unon(e.second.first, e.second.second)) ans += e.first; } 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...