Submission #139891

#TimeUsernameProblemLanguageResultExecution timeMemory
139891MinnakhmetovSirni (COCI17_sirni)C++14
84 / 140
5102 ms168752 KiB
#include<bits/stdc++.h> using namespace std; #define ll long long #define all(aaa) aaa.begin(), aaa.end() const int N = 1e5 + 5, M = 1e7 + 5, INF = 1e9; int q[N], w[M], nt[M], r_nt[M], c[M]; pair<int, int> mn[N]; bool b[M]; int findSet(int v) { return q[v] < 0 ? v : q[v] = findSet(q[v]); } bool connect(int a, int b) { a = findSet(a); b = findSet(b); if (a == b) return false; if (q[a] > q[b]) swap(a, b); q[a] += q[b]; q[b] = a; return true; } signed main() { #ifdef HOME freopen("input.txt", "r", stdin); freopen("output.txt", "w", stdout); #endif ios_base::sync_with_stdio(0); cin.tie(0); int n; cin >> n; for (int i = 0; i < n; i++) { int x; cin >> x; b[x] = 1; } fill(w, w + M, -1); fill(c, c + M, -1); fill(q, q + N, -1); vector<int> v; for (int i = 0; i < M; i++) { if (b[i]) { w[i] = v.size(); v.push_back(i); } } for (int i = 0; i < v.size(); i++) { for (int j = v[i]; j < M; j += v[i]) { c[j] = i; } } nt[M - 1] = INF; for (int i = M - 2; i >= 0; i--) { nt[i] = b[i] ? i : nt[i + 1]; } r_nt[0] = -1; for (int i = 1; i < M; i++) { r_nt[i] = c[i] != -1 ? i : r_nt[i - 1]; } // for (int i = 0; i < 20; i++) { // cout << nt[i] << " "; // } // cout << "\n"; // for (int i = 0; i < 20; i++) { // cout << w[i] << " "; // } // cout << "\n"; int cnt = v.size(); ll ans = 0; while (cnt > 1) { for (int i = 0; i < v.size(); i++) mn[i] = { INF, -1 }; for (int k = 0; k < v.size(); k++) { int x = v[k], cur_set = findSet(k); for (int i = x; i < M - 1; i += x) { int j = x == i ? nt[i + 1] : nt[i]; if (j < i + x) { int oth_set = findSet(w[j]); if (oth_set != cur_set) { mn[cur_set] = min(mn[cur_set], { j - i, oth_set }); mn[oth_set] = min(mn[oth_set], { j - i, cur_set }); } } } if (r_nt[x - 1] != -1) { int bef = r_nt[x - 1], oth_set = findSet(c[bef]); if (oth_set != cur_set) { mn[cur_set] = min(mn[cur_set], { x - bef, oth_set }); mn[oth_set] = min(mn[oth_set], { x - bef, cur_set }); } } } for (int i = 0; i < v.size(); i++) { if (q[i] < 0 && mn[i].second != -1 && connect(i, mn[i].second)) { ans += mn[i].first; cnt--; } } } cout << ans; return 0; }

Compilation message (stderr)

sirni.cpp: In function 'int main()':
sirni.cpp:62:23: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
     for (int i = 0; i < v.size(); i++) {
                     ~~^~~~~~~~~~
sirni.cpp:94:27: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
         for (int i = 0; i < v.size(); i++)
                         ~~^~~~~~~~~~
sirni.cpp:98:27: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
         for (int k = 0; k < v.size(); k++) {
                         ~~^~~~~~~~~~
sirni.cpp:122:27: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
         for (int i = 0; i < v.size(); i++) {
                         ~~^~~~~~~~~~
#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...