제출 #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...