Submission #168342

#TimeUsernameProblemLanguageResultExecution timeMemory
168342johuthaGame (IOI14_game)C++14
15 / 100
2 ms424 KiB
#include "game.h" #include <vector> #include <iostream> #include <algorithm> using namespace std; struct unionfind { vector<int> boss; int find(int x) { if (boss[x] == x) return x; return boss[x] = find(boss[x]); } void unite(int a, int b) { if (rand() % 2 == 0) { boss[find(a)] = find(b); } else { boss[find(b)] = find(a); } } void init(int n) { boss.resize(n); for (int i = 0; i < n; i++) { boss[i] = i; } } }; struct graph { int n; vector<vector<int>> conns; unionfind uf; void init(int in) { n = in; uf.init(n); conns.resize(n, vector<int>(n, 1)); } int& conn(int a, int b) { return conns[max(a, b)][min(a, b)]; } void addedge(int a, int b) { vector<int> newvals(n); for (int i = 0; i < n; i++) { newvals[i] = -1; if (uf.find(i) == i && i != a && i != b) { newvals[i] = conn(a, i) + conn(b, i); } } uf.unite(a, b); for (int i = 0; i < n; i++) { if (newvals[i] != -1) { conn(i, uf.find(a)) = newvals[i]; } } } void unadd(int a, int b) { conn(uf.find(a), uf.find(b))--; } bool shouldadd(int a, int b) { return conn(uf.find(a), uf.find(b)) == 1; } }; graph g; void initialize(int n) { g.init(n); } int hasEdge(int u, int v) { if (g.shouldadd(u, v)) { g.addedge(u, v); return 1; } else { g.unadd(u, v); return 0; } }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...