Submission #667488

#TimeUsernameProblemLanguageResultExecution timeMemory
667488tanprodiumSirni (COCI17_sirni)C++14
0 / 140
5072 ms52808 KiB
#include<bits/stdc++.h> using namespace std; using ll = long long; const int N = 1e5; const int V = 1e7; int a[N + 5]; int save[N + 5]; int mind[N + 5]; int id[V + 5]; int par[N + 5]; vector<int> vec[N + 5]; bool flag[N + 5]; int getpar(int u) { if (par[u] < 0) return (u); else return (par[u]); } bool uni(int u, int v) { u = getpar(u), v = getpar(v); if (u == v) return (false); if (par[u] > par[v]) swap(u, v); par[u] += par[v]; for (int x : vec[v]) { par[x] = u; vec[u].push_back(x); } return (true); } void solve() { int n; cin >> n; vector<int> cpr; for (int i = 1; i <= n; i++) { cin >> a[i]; cpr.push_back(a[i]); } sort(cpr.begin(), cpr.end()); cpr.resize(unique(cpr.begin(), cpr.end()) - cpr.begin()); n = (int)cpr.size(); set<int> s; for (int i = 1; i <= n; i++) { mind[i] = V + 1; a[i] = cpr[i - 1]; id[a[i]] = i; s.insert(a[i]); } for (int i = 1; i <= n; i++) { par[i] = -1; vec[i].push_back(i); } ll ans = 0; while (par[getpar(1)] != -n) { for (int i = 1; i <= n; i++) { flag[i] = false; mind[i] = V + 1; } for (int i = 1; i <= n; i++) if (!flag[i]) { int p = getpar(i); for (int x : vec[p]) { s.erase(a[x]); flag[x] = true; } int opposite; for (int x : vec[p]) { int val = a[x]; int d = 1; while (true) { auto iter = s.lower_bound(val * d); if (iter == s.end()) break; int nval = *iter; int y = id[nval]; int dist = nval % val; if (dist < mind[x]) { mind[x] = dist; save[x] = y; } if (dist < mind[y]) { mind[y] = dist; save[y] = x; } d = nval / val + 1; } } for (int x : vec[p]) s.insert(x); } for (int i = 1; i <= n; i++) flag[i] = false; for (int i = 1; i <= n; i++) if (!flag[i]) { int p = getpar(i); int take = -1; for (int x : vec[p]) { flag[x] = true; if (take == -1) take = x; else if (mind[x] < mind[take]) take = x; flag[x] = true; } if (uni(take, save[take])) ans += 1ll * mind[take]; } } cout << ans; } int main() { ios_base::sync_with_stdio(false); cin.tie(0); cout.tie(0); solve(); return 0; }

Compilation message (stderr)

sirni.cpp: In function 'void solve()':
sirni.cpp:86:17: warning: unused variable 'opposite' [-Wunused-variable]
   86 |             int opposite;
      |                 ^~~~~~~~
#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...