Submission #773838

#TimeUsernameProblemLanguageResultExecution timeMemory
773838boris_mihovGame (IOI14_game)C++17
0 / 100
1 ms360 KiB
#include "game.h" #include <algorithm> #include <iostream> #include <cassert> #include <numeric> #include <vector> typedef long long llong; const int MAXN = 5000 + 10; int n; struct DSU { int par[MAXN]; int dep[MAXN]; bool isPresent[MAXN][MAXN]; void build() { std::iota(par + 1, par + 1 + n, 1); std::fill(dep + 1, dep + 1 + n, 1); for (int i = 1 ; i <= n ; ++i) { std::fill(isPresent[i] + 1, isPresent[i] + 1 + n, 1); } } int find(int node) { if (par[node] == node) { return node; } return par[node] = find(par[node]); } void connect(int u, int v) { u = find(u); v = find(v); assert(u != v); if (dep[u] < dep[v]) { std::swap(u, v); } if (dep[u] == dep[v]) { dep[v]++; } par[u] = v; for (int i = 1 ; i <= n ; ++i) { isPresent[v][i] |= isPresent[u][i]; } isPresent[v][u] = false; } }; DSU dsu; bool vis[MAXN]; bool dfs(int node, int v) { if (node == v || dsu.isPresent[node][v]) { return true; } vis[node] = true; for (int u = 1 ; u <= n ; ++u) { if (vis[u] || !dsu.isPresent[node][u]) { continue; } if (dfs(u, v)) { return true; } } return false; } void initialize(int N) { n = N; dsu.build(); } int hasEdge(int u, int v) { u++; v++; u = dsu.find(u); v = dsu.find(v); std::fill(vis + 1, vis + 1 + n, false); dsu.isPresent[u][v] = 0; dsu.isPresent[v][u] = 0; if (dfs(u, v)) { return 0; } dsu.connect(u, v); return 1; }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...