제출 #1244786

#제출 시각아이디문제언어결과실행 시간메모리
1244786lncreedible자동 인형 (IOI18_doll)C++20
0 / 100
0 ms324 KiB
#include "doll.h"
#include <bits/stdc++.h>
using namespace std;
vector<int> C;
vector<int> X;
vector<int> Y;
int switch_counter = 0;

int nsw() {
    X.push_back(0);
    Y.push_back(0);
    return -(++switch_counter);
}


int br(size_t start_idx, size_t count, int kill_dest, const vector<int>& dests) {
    if (count == 1) {
        if (start_idx < dests.size()) {
            return dests[start_idx];
        }
        else {
            return kill_dest;
        }
    }
    
    int csw = nsw();
    size_t half = count / 2;
    
    int lc = br(start_idx, half, kill_dest, dests);
    int rc = br(start_idx + half, half, kill_dest, dests);
    
    X[-csw - 1] = lc;
    Y[-csw - 1] = rc;
    
    return csw;
}

int cms(const vector<int>& dests) {
    size_t k = dests.size();
    if (k == 0) return 0;
    if (k == 1) return dests[0];

    size_t m = 1;
    while (m < k) {
        m *= 2;
    }

    int rsw = nsw();
    
    size_t half = m / 2;
    int lc = br(0, half, rsw, dests);
    int rc = br(half, half, rsw, dests);
    
    X[-rsw - 1] = lc;
    Y[-rsw - 1] = rc;
    
    return rsw;
}

void create_circuit(int M, vector<int> A) {
  int N = A.size();
  C.assign(M + 1, 0);

  vector<int> destinations = A;
  destinations.push_back(0); 

  size_t k = destinations.size();
  if (k == 1) { 
      answer(C, X, Y);
      return;
  }

  int master_root = cms(destinations);

  C[0] = master_root;
  
  vector<bool> is_trigger_used(M + 1, false);
  for (int trigger_id : A) {
      if (trigger_id > 0 && trigger_id <= M) {
          is_trigger_used[trigger_id] = true;
      }
  }

  for (int t = 1; t <= M; ++t) {
      if (is_trigger_used[t]) {
          C[t] = master_root;
      }
  }
  
  answer(C, 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...