이 제출은 이전 버전의 oj.uz에서 채점하였습니다. 현재는 제출 당시와는 다른 서버에서 채점을 하기 때문에, 다시 제출하면 결과가 달라질 수도 있습니다.
#include "bits/stdc++.h"
#include "chameleon.h"
using namespace std;
namespace {
  const int maxn = 5e3 + 10;
  vector <int> g[maxn];
  int col[maxn];
  void addEdge(int i, int j) {
    g[i].push_back(j);
    g[j].push_back(i);
  }
  void dfs(int x) {
    for(int i : g[x]) {
      if(col[i] == -1) {
        col[i] = col[x] ^ 1;
        dfs(i);
      }
    }
  }
  void partition(int V, vector <int> &u, vector <int> &v) {
    for(int i = 1; i <= V; i++) {
      col[i] = -1;
    }
    for(int i = 1; i <= V; i++) {
      if(col[i] == -1) {
        col[i] = 0;
        dfs(i);
      }
    }
    for(int i = 1; i <= V; i++) {
      if(col[i] == 0) u.push_back(i);
      else v.push_back(i);
    }
  }
  bool makeEdge(vector <int> &v, int i) {
    if(v.size() == 0) return false;
    vector <int> u = v;
    u.push_back(i);
    if(Query(u) == u.size()) return false;
    int l = 0, r = v.size() - 1;
    while(l < r) {
      int mid = (l + r) >> 1;
      vector <int> aux = v;
      aux.resize(mid + 1);
      aux.push_back(i);
      if(Query(aux) == aux.size()) l = mid + 1;
      else r = mid;
    }
    addEdge(v[l], i);
    v.erase(v.begin() + l);
    return true;
  }
  bool makeEdges(vector <int> &v, int i) {
    while(makeEdge(v, i));
  }
}  // namespace
void Solve(int N) {
  for(int i = 1; i <= 2 * N; i++) {
    vector <int> u, v;
    partition(i - 1, u, v);
    makeEdges(u, i);
    makeEdges(v, i);
  }
  set <pair <int, int>> s;
  set <int> done;
  for(int i = 1; i <= 2 * N; i++) {
    if(g[i].size() == 1) {
      int p = i, q = g[i].front();
      if(p > q) swap(p, q);
      s.insert(make_pair(p, q));
      done.insert(p);
      done.insert(q);
    }
  }
  map <pair <int, int>, int> cnt;
  for(int i = 1; i <= 2 * N; i++) {
    if(done.count(i) == 0) {
      for(int x = 0; x < 3; x++) {
        for(int y = x + 1; y < 3; y++) {
          int p = g[i][x], q = g[i][y];
          if(Query(vector <int> ({p, q, i})) == 1) {
            int j = p, k = i;
            if(j > k) swap(j, k);
            cnt[make_pair(j, k)] += 1;
            j = q; k = i;
            if(j > k) swap(j, k);
            cnt[make_pair(j, k)] += 1;
          }
        }
      }
    }
  }
  for(auto i : cnt) if(i.second == 2) s.insert(i.first);
  for(auto i : s) {
    Answer(i.first, i.second);
  }
}
컴파일 시 표준 에러 (stderr) 메시지
chameleon.cpp: In function 'bool {anonymous}::makeEdge(std::vector<int>&, int)':
chameleon.cpp:40:17: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
     if(Query(u) == u.size()) return false;
        ~~~~~~~~~^~~~~~~~~~~
chameleon.cpp:47:21: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
       if(Query(aux) == aux.size()) l = mid + 1;
          ~~~~~~~~~~~^~~~~~~~~~~~~
chameleon.cpp: In function 'bool {anonymous}::makeEdges(std::vector<int>&, int)':
chameleon.cpp:56:3: warning: no return statement in function returning non-void [-Wreturn-type]
   }
   ^| # | Verdict  | Execution time | Memory | Grader output | 
|---|
| Fetching results... | 
| # | Verdict  | Execution time | Memory | Grader output | 
|---|
| Fetching results... | 
| # | Verdict  | Execution time | Memory | Grader output | 
|---|
| Fetching results... | 
| # | Verdict  | Execution time | Memory | Grader output | 
|---|
| Fetching results... | 
| # | Verdict  | Execution time | Memory | Grader output | 
|---|
| Fetching results... |