Submission #734517

#TimeUsernameProblemLanguageResultExecution timeMemory
734517TahirAliyevSirni (COCI17_sirni)C++17
140 / 140
2883 ms534908 KiB
#include <bits/stdc++.h> #pragma GCC optimize("O3") using namespace std; #define ll long long int #define oo 1e9 #define pii pair<int, int> const int MAX = 1e5 + 5; int n; int par[MAX]; int findSet(int u){ if(par[u] < 0) return u; return par[u] = findSet(par[u]); } bool unite(int u, int v){ u = findSet(u); v = findSet(v); if(u == v) return false; if(-par[u] < -par[v]) swap(u, v); par[u] += par[v]; par[v] = u; return true; } bool check(int u, int v){ u = findSet(u); v = findSet(v); if(u == v) return true; return false; } int v[MAX]; vector<pii> edges[int(1e7 + 7)]; void solve(){ memset(par, -1, sizeof(par)); cin >> n; for (int i = 0; i < n; i++) { cin >> v[i]; } sort(v, v + n); int m = v[n - 1]; for (int i = 0; i < n; i++) { if(i != 0 && v[i] == v[i - 1]) continue; for (int r = v[i]; r <= m; r += v[i]) { auto itr = lower_bound(v, v + n, r); if(r == v[i]){ itr = upper_bound(v, v + n, r); } if(itr == (v + n)){ break; } if((*itr) >= (r + v[i])){ r = (*itr) / v[i] * v[i]; } edges[(*itr) % v[i]].push_back({i, int(itr - v)}); } } ll ans = 0; for(int i = 0; i <= 1e7; ++i){ for(auto& p:edges[i]){ if(unite(p.first, p.second)){ ans += i; } } } cout << ans; } int main(){ solve(); }
#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...