Submission #248105

#TimeUsernameProblemLanguageResultExecution timeMemory
248105kartelSirni (COCI17_sirni)C++14
84 / 140
2518 ms50552 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 +1000500 #define M ll(1e9 + 7) #define sz(x) (int)x.size() #define re return #define oo ll(1e9) #define el '\n' //#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, ans, n, p[N], ost, x, y; vector <pair <int, pair <int, int> > > g; vector <int> P[N]; 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; 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; 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 (x = 1; x <= 1000000; x++) for (i = 1; i < sz(P[x]); i++) link(P[x][0], P[x][i]); for (ost = 0; ost <= 20; ost++) for (x = ost + 1; x <= 1000000; x++) { if (!sz(P[x])) continue; for (y = x; y <= 1000000; 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...