Submission #1141495

#TimeUsernameProblemLanguageResultExecution timeMemory
1141495efishelTowns (IOI15_towns)C++20
0 / 100
1093 ms27592 KiB
#include "towns.h" #include <bits/stdc++.h> using namespace std; using ll = long long; using vll = vector <ll>; using ii = pair <ll, ll>; using vii = vector <ii>; using vvll = vector <vll>; const ll INF = ll(1E18)+16; struct Info { ll u1, u2, u3; ll dis1, dis2, dis3; ll id; }; struct DSU { vll par; vll sz; DSU (ll n): par(n), sz(n, 1) { iota(par.begin(), par.end(), 0); } ll find (ll u) { return u == par[u] ? u : par[u] = find(par[u]); } void join (ll u, ll v) { u = find(u); v = find(v); if (u == v) return; if (sz[u] > sz[v]) swap(u, v); par[u] = v; sz[v] += sz[u]; } }; int hubDistance (int n, int sub) { vvll dis(n, vll(n, 0)); for (ll i = 0; i < n; i++) { for (ll j = i+1; j < n; j++) { dis[i][j] = dis[j][i] = getDistance(i, j); } } auto fdiss = [&](ll u1, ll u2, ll u3) -> array <ll, 3> { ll d1 = dis[u1][u2], d2 = dis[u1][u3], d3 = dis[u2][u3]; ll disU1 = (d3-d1-d2)/-2; ll disU2 = (d2-d1-d3)/-2; ll disU3 = (d1-d2-d3)/-2; return { disU1, disU2, disU3 }; }; // for (ll i: fdiss(0, 1, 2) )cerr<<i<< ' '; // cerr<<'\n'; vector <Info> ve; ll id = 0; for (ll u1 = 0; u1 < n; u1++) { for (ll u2 = u1+1; u2 < n; u2++) { for (ll u3 = u2+1; u3 < n; u3++) { auto [dis1, dis2, dis3] = fdiss(u1, u2, u3); ve.push_back({ u1, u2, u3, dis1, dis2, dis3, id++ }); } } } map <pair <ii, ii>, ll> mp; DSU dsu(id); for (auto [u1, u2, u3, dis1, dis2, dis3, id] : ve) { if (!mp.count({ { u1, dis1 }, { u2, dis2 } })) mp[{ { u1, dis1 }, { u2, dis2 } }] = id; if (!mp.count({ { u1, dis1 }, { u3, dis3 } })) mp[{ { u1, dis1 }, { u3, dis3 } }] = id; if (!mp.count({ { u2, dis2 }, { u3, dis3 } })) mp[{ { u2, dis2 }, { u3, dis3 } }] = id; ll &a = mp[{ { u1, dis1 }, { u2, dis2 } }]; ll &b = mp[{ { u1, dis1 }, { u3, dis3 } }]; ll &c = mp[{ { u2, dis2 }, { u3, dis3 } }]; dsu.join(a, id); dsu.join(b, id); dsu.join(c, id); } map <ll, ll> mpAns; for (Info a : ve) { mpAns[dsu.find(a.id)] = max({ mpAns[dsu.find(a.id)], a.dis1, a.dis2, a.dis3 }); } // for (Info a : ve) { // if (a.u1 == 9 && a.dis1 == 13 // || a.u2 == 9 && a.dis2 == 13 // /* || a.u3 == 9 && a.dis3 == 13 */) cerr << dsu.find(a.id) << '\n'; // } ll ans = INF; for (auto [_, d] : mpAns) ans = min(ans, d); // for (auto [_, d] : mp) cerr << _ << ": " << d << '\n'; // cerr << mpAns.size() << '\n'; return ans; }
#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...