Submission #248188

#TimeUsernameProblemLanguageResultExecution timeMemory
248188kartelSirni (COCI17_sirni)C++14
126 / 140
5035 ms245316 KiB
#include <bits/stdc++.h> //#include <ext/pb_ds/assoc_container.hpp> //#include <ext/pb_ds/tree_policy.hpp> #define in(x) freopen(x, "r", stdin) #define out(x) freopen(x, "w", stdout) #pragma GCC optimize("Ofast") #pragma GCC optimize("unroll-loops") #pragma GCC optimize("-O3") #define F first #define S second #define pb push_back #define N +100500 #define M ll(1e9 + 7) #define sz(x) (int)x.size() #define re return #define oo ll(1e9) #define el '\n' #define Max_P int(1e7) //#define el endl #define pii pair <int, int> #define err ld(1e-9) #define last(x) x.back() #define all(x) (x).begin(), (x).end() #define arr_all(x, n) (x + 1), (x + 1 + n) using namespace std; //using namespace __gnu_pbds; //typedef tree <int, null_type, less_equal <int> , rb_tree_tag, tree_order_statistics_node_update> ordered_set; typedef long long ll; typedef long double ld; int pr[N], ra[N], i, j, n, p[N], ost, x, y, linked = 0, siz[N]; ll ans; vector <pair <int, pair <int, int> > > g; vector <int> P[Max_P + 50]; set <int> se; int f(int x) { if (pr[x] != x) return (pr[x] = f(pr[x])); return x; } void link(int x, int y) { x = f(x); y = f(y); if (x == y) return; siz[x] += siz[y]; siz[y] = siz[x]; if (siz[x] == n) linked = 1; if (ra[x] > ra[y]) pr[x] = y; else { pr[y] = x; if (ra[x] == ra[y]) ra[y]++; } } int main() { srand(time(0)); ios_base::sync_with_stdio(0); iostream::sync_with_stdio(0); ios::sync_with_stdio(0); cin.tie(NULL); cout.tie(NULL); // in("input.txt"); // out("output.txt"); cin >> n; for (i = 1; i <= n; i++) cin >> p[i], pr[i] = i, ra[i] = 1, siz[i] = 1, se.insert(p[i]); if (n <= 1000) { for (i = 1; i <= n; i++) for (j = i + 1; j <= n; j++) { int a = max(p[i], p[j]); int b = min(p[i], p[j]); g.pb({a % b, {i, j}}); } sort(all(g)); reverse(all(g)); while (sz(g)) { int a = g.back().S.F, b = g.back().S.S; int cost = g.back().F; g.pop_back(); if (f(a) != f(b)) { ans += cost; link(a, b); } } } else { for (i = 1; i <= n; i++) P[p[i]].pb(i); for (ost = 0; !linked; ost++) for (auto x : se) { if (x < ost + 1) continue; if (!sz(P[x])) continue; for (y = x; y <= Max_P - ost; y += x) { if (y + ost != x && !sz(P[y + ost])) continue; for (auto a : P[y + ost]) if (f(a) != f(P[x][0])) link(a, P[x][0]), ans += ost; } } } cout << ans; } // //00000 //00110 //00111 //00011 //00000
#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...