Submission #292331

#TimeUsernameProblemLanguageResultExecution timeMemory
292331VodkaInTheJarGame (IOI14_game)C++14
100 / 100
531 ms8568 KiB
#include <bits/stdc++.h> using namespace std; const int maxn = 1503; const int k = 40; int cnt[maxn][maxn]; vector <int> adj[maxn]; int n, cnt_buckets; void initialize(int m) { n = m; cnt_buckets = (n - 1) / k; for (int i = 1; i <= n; i++) for (int j = i + 1; j <= n; j++) { if ((i - 1) / k == (j - 1) / k) adj[i].push_back(j), adj[j].push_back(i); else cnt[(i - 1) / k][(j - 1) / k]++, cnt[(j - 1) / k][(i - 1) / k]++; } } int cnt_used = 0; bool used[maxn]; void dfs1(int ver) { used[ver] = true; cnt_used++; for (int i = 0; i <= cnt_buckets; i++) if (!used[i] && cnt[ver][i]) dfs1(i); } void dfs2(int ver) { used[ver] = true; cnt_used++; for (auto i: adj[ver]) if (!used[i]) dfs2(i); } int hasEdge(int u, int v) { u++; v++; if ((u - 1) / k == (v - 1) / k) { auto it1 = find(adj[u].begin(), adj[u].end(), v); auto it2 = find(adj[v].begin(), adj[v].end(), u); adj[u].erase(it1); adj[v].erase(it2); int first = (u - 1) / k * k + 1; int last = min(n, first + k - 1); for (int i = first; i <= last; i++) used[i] = false; cnt_used = 0; dfs2(first); if (cnt_used != last - first + 1) { adj[u].push_back(v); adj[v].push_back(u); return 1; } return 0; } else { cnt[(u - 1) / k][(v - 1) / k]--; cnt[(v - 1) / k][(u - 1) / k]--; if (cnt[(u - 1) / k][(v - 1) / k] >= 1) return 0; for (int i = 0; i <= cnt_buckets; i++) used[i] = false; cnt_used = 0; dfs1(0); if (cnt_used != cnt_buckets + 1) { cnt[(u - 1) / k][(v - 1) / k]++; cnt[(v - 1) / k][(u - 1) / k]++; return 1; } return 0; } }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...