Submission #310383

#TimeUsernameProblemLanguageResultExecution timeMemory
310383thecodingwizardSirni (COCI17_sirni)C++11
98 / 140
5089 ms368996 KiB
#include <bits/stdc++.h> using namespace std; using ll = long long; #define pb push_back #define mp make_pair #define f first #define s second #define ii pair<int, int> int pa[100000], sz[100000]; int findSet(int x) { return pa[x] == x ? x : pa[x] = findSet(pa[x]); } void unite(int a, int b) { a = findSet(a); b = findSet(b); if (sz[a] > sz[b]) swap(a, b); pa[a] = b; sz[b] += sz[a]; } int main() { cin.tie(0); ios_base::sync_with_stdio(false); int n; cin >> n; set<int> nums; for (int i = 0; i < n; i++) { int p; cin >> p; nums.insert(p); } map<int, int> idx; int ctr = 0; for (int num : nums) { idx[num] = ctr++; } for (int i = 0; i < n; i++) { sz[i] = 1; pa[i] = i; } vector<ii> edges[(int)1e7+10]; for (int num : nums) { int prev = -1; for (int i = num; i <= 1e7; i += num) { auto it = i == num ? nums.upper_bound(i) : nums.lower_bound(i); if (it != nums.end()) { if (prev == *it) continue; prev = *it; edges[(*it)%num].pb(mp(idx[num], idx[*it])); } else { break; } } /* for (int num2 : nums) { if (num < num2) edges.pb(mp(num2%num, mp(idx[num], idx[num2]))); } */ } ll ans = 0; for (int c = 0; c <= 1e7; c++) { for (auto e : edges[c]) { if (findSet(e.f) != findSet(e.s)) { ans += c; unite(e.f, e.s); } } } 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...