Submission #1289911

#TimeUsernameProblemLanguageResultExecution timeMemory
1289911lucaskojimaICC (CEOI16_icc)C++17
0 / 100
3 ms616 KiB
#include "bits/stdc++.h"
#include "icc.h"
#define sz(x) (int)size(x)
#define all(x) begin(x), end(x)
#define rall(x) rbegin(x), rend(x)

using namespace std;
using ll = long long;
using pii = pair<int, int>;

const char nl = '\n';
const int INF = 0x3f3f3f3f;
const ll LINF = 0x3f3f3f3f3f3f3f3f;
const int N   = 100;

int a[N], b[N], cur[N];

void clear() {
  for (int i = 0; i < N; i++) {
    a[i] = 0, b[i] = 0;
  }
}
void clear_cur() {
  for (int i = 0; i < N; i++)
    cur[i] = 0;
}

void run(int n) {
  vector<vector<int>> cmp(n);
  for (int i = 0; i < n; i++)
    cmp[i].push_back(i + 1);

  for (int _ = 0; _ < n - 1; _++) {
    int k = sz(cmp);
    vector<pii> intervals = {{0, k - 1}};
    vector<pii> nxt;

    while (1) {
      for (auto [l, r] : intervals) {
        if (l == r) {
          nxt.push_back({l, r});
          continue;
        }
        int m = (l + r) / 2;
        nxt.push_back({l, m});
        nxt.push_back({m + 1, r});
      }
      swap(intervals, nxt);

      clear();
      int size_a = 0;
      for (int i = 0; i < sz(intervals); i += 2) {
        auto [l, r] = intervals[i];
        for (int j = l; j <= r; j++)
          for (int x : cmp[j])
            a[size_a++] = x;
      }
      int size_b = 0;
      for (int i = 1; i < sz(intervals); i += 2) {
        auto [l, r] = intervals[i];
        for (int j = l; j <= r; j++)
          for (int x : cmp[j])
            b[size_b++] = x;
      }

      if (query(size_a, size_b, a, b) == 1) {

        auto recA = [&](auto recA, int l, int r) -> int {
          if (l == r) return a[l];
          int m = (l + r) / 2;

          clear_cur();
          int size = 0;
          for (int i = l; i <= m; i++)
            cur[size++] = a[i];

          if (query(size, size_b, cur, b) == 1)
            return recA(recA, l, m);
          else
            return recA(recA, m + 1, r);
        };
        auto recB = [&](auto recB, int l, int r) -> int {
          if (l == r) return b[l];
          int m = (l + r) / 2;

          clear_cur();
          int size = 0;
          for (int i = l; i <= m; i++)
            cur[size++] = b[i];

          if (query(size, size_a, cur, a) == 1)
            return recB(recB, l, m);
          else
            return recB(recB, m + 1, r);
        };

        int A = recA(recA, 0, size_a - 1);
        int B = recB(recB, 0, size_b - 1);
        setRoad(A, B);

        vector<vector<int>> nxt_cmp;
        int id = -1;
        for (int i = 0; i < k; i++) {
          bool f = false;
          for (int x : cmp[i])
            if (x == A || x == B)
              f = true;

          if (!f) {
            nxt_cmp.push_back(cmp[i]);
          } else {
            if (id == -1) {
              id = i;
              nxt_cmp.push_back(cmp[i]);
            } else {
              for (int x : cmp[i])
                nxt_cmp[id].push_back(x);
            }
          }
        }
        swap(cmp, nxt_cmp);
        break;
      }
    }
  }
}
#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...
#Verdict Execution timeMemoryGrader output
Fetching results...