제출 #1186605

#제출 시각아이디문제언어결과실행 시간메모리
1186605versesrev게임 (IOI14_game)C++20
100 / 100
699 ms7284 KiB
#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 timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...