Submission #962092

#TimeUsernameProblemLanguageResultExecution timeMemory
962092yellowtoadMechanical Doll (IOI18_doll)C++17
100 / 100
98 ms12888 KiB
#include "doll.h"
#include <iostream>
using namespace std;

int n, idx, b[500010], cnt, cnnt;
vector<int> a, edge[2];

void run(int id, int x, int y) {
  int mid = (x+y)/2;
  if (b[id] == 0) {
    b[id] = 1;
    if (n < mid+1) {
      edge[0][id-1] = -1;
      return;
    }
    if (mid+1 == y) {
      edge[0][id-1] = a[cnnt++];
      return;
    }
    if (edge[0][id-1] == 1e9) {
      edge[0].push_back(1e9);
      edge[1].push_back(1e9);
      edge[0][id-1] = --cnt;
    }
    run(-edge[0][id-1],mid+1,y);
  } else {
    b[id] = 0;
    if (mid+1 == y) {
      edge[1][id-1] = a[cnnt++];
      return;
    }
    if (edge[1][id-1] == 1e9) {
      edge[0].push_back(1e9);
      edge[1].push_back(1e9);
      edge[1][id-1] = --cnt;
    }
    run(-edge[1][id-1],x,mid);
  }
}

void create_circuit(int m, std::vector<int> A) {
  a = A;
  a.push_back(0);
  n = a.size();
  vector<int> C(m+1,-1);
  while ((1<<(idx+1)) < n) idx++;
  edge[0].push_back(1e9);
  edge[1].push_back(1e9);
  cnt = -1;
  for (int i = 1; i <= (1<<(idx+1)); i++) run(1,1,(1<<(idx+1)));
  answer(C,edge[0],edge[1]);
}
#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...