답안 #570304

# 제출 시각 아이디 문제 언어 결과 실행 시간 메모리
570304 2022-05-29T07:55:59 Z 600Mihnea CEOI16_icc (CEOI16_icc) C++17
18 / 100
204 ms 532 KB
#include <bits/stdc++.h>
#include "icc.h"

using namespace std;

mt19937 rng((long long) (new char));

int get(vector<int> a, vector<int> b) {
  if (a.empty() || b.empty()) {
    return 0;
  }
  return query((int) a.size(), (int) b.size(), a.data(), b.data());
}

vector<int> operator + (vector<int> a, vector<int> b) {
  for (auto &x : b) {
    a.push_back(x);
  }
  return a;
}

const int N = 100 + 7;
int t[N];

int get_root(int a) {
  if (t[a] == a) {
    return a;
  } else {
    return t[a] = get_root(t[a]);
  }
}

void join(int a, int b) {
  t[get_root(a)] = get_root(b);
}

void run(int n) {
  for (int i = 1; i <= n; i++) {
    t[i] = i;
  }
  for (int step = 1; step <= n - 1; step++) {
    vector<vector<int>> comps;
    for (int i = 1; i <= n; i++) {
      if (get_root(i) == i) {
        vector<int> currentComp;
        for (int j = 1; j <= n; j++) {
          if (get_root(j) == i) {
            currentComp.push_back(j);
          }
        }
        comps.push_back(currentComp);
      }
    }

    assert((int) comps.size() == n - step + 1);
    assert((int) comps.size() >= 2);

    vector<int> p1, p2;
    while (1) {
      p1.clear();
      p2.clear();
      for (auto &comp : comps) {
        if (rng() & 1) {
          p1 = p1 + comp;
        } else {
          p2 = p2 + comp;
        }
      }
      assert((int) p1.size() + (int) p2.size() == n);
      if (get(p1, p2) == 1) {
        break;
      }
    }
    while ((int) p1.size() > 1 || (int) p2.size() > 1) {
      if ((int) p2.size() < (int) p1.size()) {
        swap(p1, p2);
      }
      assert((int) p1.size() <= (int) p2.size());
      vector<int> X, Y;
      for (auto &vertex : p2) {
        if (rng() & 1) {
          X.push_back(vertex);
        } else {
          Y.push_back(vertex);
        }
      }
      if (get(p1, X)) {
        p2 = X;
      } else {
        p2 = Y;
      }
    }
    assert((int) p1.size() == 1 && (int) p2.size() == 1);
    join(p1[0], p2[0]);
    setRoad(p1[0], p2[0]);
  }
}

# 결과 실행 시간 메모리 Grader output
1 Correct 11 ms 440 KB Ok! 134 queries used.
2 Correct 12 ms 508 KB Ok! 137 queries used.
# 결과 실행 시간 메모리 Grader output
1 Correct 42 ms 468 KB Ok! 658 queries used.
2 Correct 53 ms 496 KB Ok! 903 queries used.
3 Correct 49 ms 508 KB Ok! 879 queries used.
# 결과 실행 시간 메모리 Grader output
1 Correct 153 ms 524 KB Ok! 1815 queries used.
2 Incorrect 204 ms 532 KB Too many queries! 2257 out of 2250
3 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Correct 164 ms 532 KB Ok! 1869 queries used.
2 Correct 173 ms 532 KB Ok! 1875 queries used.
3 Incorrect 201 ms 532 KB Too many queries! 2060 out of 2000
4 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Incorrect 166 ms 528 KB Too many queries! 2108 out of 1775
2 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Incorrect 186 ms 516 KB Too many queries! 2086 out of 1625
2 Halted 0 ms 0 KB -