Submission #1186301

#TimeUsernameProblemLanguageResultExecution timeMemory
1186301hamzabc자동 인형 (IOI18_doll)C++20
100 / 100
59 ms13596 KiB
#include "doll.h"
#include <bits/stdc++.h>


using namespace std;
#define all(x) x.begin(), x.end()
#define sp << " " <<
vector<int> goes;
vector<int> X, Y;
vector<array<int, 3>> dvm;


void wire(int ret = -1, int retto = 0, int repeattime = 1, int layer = 0, int number = 0){
  bool finalise = false;
  if (ret == -1){
    finalise = true;
    int fark = goes.size();
    int loog = __lg(fark);
    if (fark == (1 << loog)){
      repeattime = (1 << loog);
      ret = 0;
    }else{
      repeattime = (1 << loog) * 2;
      retto = -X.size();
      ret = repeattime - fark;
    }
  }
  int swc = X.size() - 1;
  bool backed = false;
  if (ret >= repeattime / 2){
    backed = true;
    ret -= repeattime / 2;
    X[swc] = retto;
  }else{
    if (repeattime == 2){
      // X[swc] = goes[num][number - min(standart, (number + 1) / 2)];
      dvm.push_back({ number, swc, 1 });
    }else{
      X[swc] = -X.size() - 1;
      X.push_back(0);
      Y.push_back(0);
      wire(ret, retto, repeattime / 2, layer + 1, number);
    }
  }
  if (repeattime == 2){
    number += (1 << layer);
    dvm.push_back({ number, swc, 0 });
    // Y[swc] = goes[num][number - min(standart, (number + 1) / 2)];
  }else{
    Y[swc] = -X.size() - 1;
    X.push_back(0);
    Y.push_back(0);
    if (backed){
      wire(ret, retto, repeattime / 2, layer + 1, number + (1 << layer));
    }else{
      wire(0, 0, repeattime / 2, layer + 1, number + (1 << layer));
    }
  }
  if (finalise){
    sort(all(dvm));
    int j = 0;
    for (auto i : dvm){
      if (i[2]){
        X[i[1]] = goes[j];
      }else{
        Y[i[1]] = goes[j];
      }
      j++;
    }
    dvm.clear();
  }
}


void create_circuit(int M, vector<int> A) {
  A.push_back(0);
  goes = A;
  vector<int> Ret(M + 1);
  X.push_back(0);
  Y.push_back(0);
  for (int i = 0; i < M + 1; i++){
    Ret[i] = -1;
  }
  wire();
  answer(Ret, X, Y);
}
#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...