#include <deque>
#include <vector>
#include <bitset>
#include <algorithm>
#include <cassert>
constexpr int N = 1500;
int n{};
std::vector<std::bitset<N>> edges;
std::bitset<N> mask;
std::vector<int> degs;
void initialize(int _n) {
//assert(_n != N);
n = _n;
edges.assign(n, {});
degs.assign(n, n);
for (int i = 0; i < n; ++i) mask[i] = true;
for (int i = 0; i < n; ++i) {
edges[i] = ~edges[i] & mask;
}
}
int hasEdge(int u, int v) {
edges[u][v] = edges[v][u] = false;
--degs[u], --degs[v];
if (degs[u] + degs[v] - 2 > n - 2 or (edges[u] & edges[v]).any()) {
return edges[u][v];
}
if (edges[v].count() > edges[u].count()) {
std::swap(u, v);
}
int start = std::distance(degs.begin(), std::ranges::max_element(degs));
std::bitset<N> not_visited = mask;
std::bitset<N> new_vs, next_new_vs;
new_vs = edges[start], not_visited &= ~edges[start];
while ((not_visited[v] or not_visited[u]) and new_vs.any()) {
next_new_vs.reset();
for (int i = 0; i < n; ++i) {
if (new_vs[i]) {
next_new_vs |= edges[i];
}
}
new_vs = next_new_vs & not_visited;
not_visited &= ~new_vs;
}
if (not_visited[v] or not_visited[u]) {
edges[u][v] = edges[v][u] = true;
++degs[u], ++degs[v];
}
return edges[u][v];
}
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |