제출 #1331703

#제출 시각아이디문제언어결과실행 시간메모리
1331703phancddevAncient Machine (JOI21_ancient_machine)C++20
0 / 100
43 ms7444 KiB
#include "Anna.h"
#include <vector>

namespace {


int enc(char c) {
  if (c == 'X') return 0;
  if (c == 'Y') return 1;
  return 2; 
}

}  

void Anna(int N, std::vector<char> S) {
  
  for (int i = 0; i < N; i++) {
    int v = enc(S[i]);
    Send(v & 1);
    Send((v >> 1) & 1);
  }
}
#include "Bruno.h"
#include <vector>

namespace {

int dec(int b0, int b1) { return b0 | (b1 << 1); }

}

void Bruno(int N, int L, std::vector<int> A) {
  std::vector<char> S(N);
  for (int i = 0; i < N; i++) {
    int v = dec(A[2*i], A[2*i + 1]);
    if (v == 0) S[i] = 'X';
    else if (v == 1) S[i] = 'Y';
    else S[i] = 'Z';
  }

  int x0 = -1;
  for (int i = 0; i < N; i++) {
    if (S[i] == 'X') { x0 = i; break; }
  }

  if (x0 == -1) {
    for (int i = 0; i < N; i++) Remove(i);
    return;
  }

  std::vector<char> removed(N, 0);
  std::vector<int> order;
  order.reserve(N);

  auto do_remove = [&](int idx) {
    if (!removed[idx]) {
      removed[idx] = 1;
      order.push_back(idx);
    }
  };

  for (int i = 0; i < x0; i++) do_remove(i);

  int prefixEnd = x0;
  bool seenX = true;
  bool haveY = false;
  int lastY = -1;

  for (int i = x0 + 1; i < N; i++) {
    if (S[i] == 'X') {
      seenX = true;
    } else if (S[i] == 'Y') {
      if (seenX) {
        haveY = true;
        lastY = i;
      }
    } else {
      if (haveY) {
        for (int k = prefixEnd + 1; k <= i - 1; k++) {
          if (k == lastY) continue;
          do_remove(k);
        }
        do_remove(lastY);
        do_remove(i);

        prefixEnd = i;
        haveY = false;
        lastY = -1;
      }
    }
  }

  for (int i = prefixEnd + 1; i < N; i++) do_remove(i);

  do_remove(x0);

  for (int idx : order) Remove(idx);
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...