Submission #288531

#TimeUsernameProblemLanguageResultExecution timeMemory
288531emil_physmathGame (IOI14_game)C++17
15 / 100
1 ms512 KiB
#include <unordered_set> #include <algorithm> #include <vector> #include <set> #include "game.h" using namespace std; const int maxN = 1500; int n; int cnt[maxN][maxN]; unordered_set<int> nei[maxN]; int par[maxN], sz[maxN], centre[maxN]; int Root(int v) { return v == par[v] ? v : par[v] = Root(par[v]); } void Union(int u, int v) { u = Root(u); v = Root(v); if (u == v) return; if (sz[u] > sz[v]) swap(u, v); int c1 = centre[u], c2 = centre[u]; if (nei[c1].size() > nei[c2].size()) swap(c1, c2); for (int to: nei[c1]) { --cnt[c1][to]; --cnt[to][c1]; nei[c2].insert(to); nei[to].insert(c2); ++cnt[c2][to]; ++cnt[to][c2]; } nei[c1].clear(); sz[v] += sz[u]; par[u] = v; centre[v] = c2; } void initialize(int n_) { n = n_; for (int v = 0; v < n; ++v) { par[v] = v, sz[v] = 1, centre[v] = v; nei[v].reserve(n); } } int hasEdge(int u, int v) { int c1 = centre[Root(u)]; int c2 = centre[Root(v)]; nei[c1].insert(c2); nei[c2].insert(c1); ++cnt[c1][c2]; ++cnt[c2][c1]; if (cnt[c1][c2] == sz[Root(u)] * sz[Root(v)]) { Union(u, v); return 1; } return 0; }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...