Submission #24103

#TimeUsernameProblemLanguageResultExecution timeMemory
24103jiaqiyangPark (JOI17_park)C++14
100 / 100
479 ms1444 KiB
#include "park.h"
#include <cassert>
#include <cstring>
#include <vector>
#include <algorithm>

static const int N = 1500 + 10;

static int query(int a, int b, int tag[]) {
  if (a > b) std::swap(a, b);
  return Ask(a, b, tag);
}

static int n;
static int tag[N];

static std::vector<int> adj[N];

static void link(int a, int b) {
  if (a > b) std::swap(a, b);
  Answer(a, b);
  adj[a].push_back(b);
  adj[b].push_back(a);
}

static bool flag[N], mark[N];

static std::vector<int> res;

static std::vector<int> bfs(int s) {
  std::vector<int> res;
  res.push_back(s);
  for (int i = 0; i < res.size(); ++i) {
    int a = res[i];
    mark[a] = false;
    for (int j = 0; j < adj[a].size(); ++j) if (mark[adj[a][j]]) res.push_back(adj[a][j]);
  }
  return res;
}

static void connect(int a, std::vector<int> &cur) {
  for (int i = 0; i < n; ++i) tag[i] = 0;
  for (int i = 0; i < cur.size(); ++i) tag[cur[i]] = 1;
  tag[a] = 1;
  if (!query(a, cur[0], tag)) return;
  int l = 0, r = cur.size();
  while (l < r) {
    int mid = (l + r) >> 1;
    for (int i = 0; i < n; ++i) tag[i] = 0;
    for (int i = 0; i <= mid; ++i) tag[cur[i]] = 1;
    tag[a] = 1;
    if (query(a, cur[0], tag)) r = mid; else l = mid + 1;
  }
  int b = cur[l];
  link(a, b);
  for (int i = 0; i < cur.size(); ++i) mark[cur[i]] = true;
  mark[b] = false;
  std::vector< std::vector<int> > pool;
  for (int i = 0; i < cur.size(); ++i) if (mark[cur[i]]) pool.push_back(bfs(cur[i]));
  for (int i = 0; i < pool.size(); ++i) connect(a, pool[i]);
}

static void solve(int a) {
  for (int r = n;; solve(r)) {
    for (int i = 0; i < n; ++i) tag[i] = flag[i];
    tag[a] = 1;
    if (query(0, a, tag)) break;
    for (int l = 1; l < r;) {
      int mid = (l + r) >> 1;
      for (int i = 0; i < n; ++i) tag[i] = (i <= mid || flag[i]);
      tag[a] = 1;
      if (query(0, a, tag)) r = mid; else l = mid + 1;
    }
  }
  memcpy(mark, flag, sizeof mark);
  flag[a] = true;
  std::vector<int> cur = bfs(0);
  connect(a, cur);
}

void Detect(int _t, int _n) {
  n = _n;
  memset(flag, 0, sizeof flag);
  flag[0] = true;
  for (int i = 1; i < n; ++i) if (!flag[i]) solve(i);
}

Compilation message (stderr)

park.cpp: In function 'std::vector<int> bfs(int)':
park.cpp:33:21: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
   for (int i = 0; i < res.size(); ++i) {
                     ^
park.cpp:36:23: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
     for (int j = 0; j < adj[a].size(); ++j) if (mark[adj[a][j]]) res.push_back(adj[a][j]);
                       ^
park.cpp: In function 'void connect(int, std::vector<int>&)':
park.cpp:43:21: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
   for (int i = 0; i < cur.size(); ++i) tag[cur[i]] = 1;
                     ^
park.cpp:56:21: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
   for (int i = 0; i < cur.size(); ++i) mark[cur[i]] = true;
                     ^
park.cpp:59:21: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
   for (int i = 0; i < cur.size(); ++i) if (mark[cur[i]]) pool.push_back(bfs(cur[i]));
                     ^
park.cpp:60:21: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
   for (int i = 0; i < pool.size(); ++i) connect(a, pool[i]);
                     ^
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...