제출 #1331706

#제출 시각아이디문제언어결과실행 시간메모리
1331706phancddevAncient Machine (JOI21_ancient_machine)C++20
0 / 100
1056 ms7800 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 z0 = -1;
  for (int i = N - 1; i >= 0; i--) {
    if (S[i] == 'Z') { z0 = i; break; }
  }

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

  std::vector<int> stackX;
  std::vector<std::pair<int,int>> pairs;
  stackX.reserve(N);
  pairs.reserve(N);

  for (int i = 0; i < z0; i++) {
    if (S[i] == 'X') stackX.push_back(i);
    else if (S[i] == 'Y') {
      if (!stackX.empty()) {
        int x = stackX.back(); stackX.pop_back();
        pairs.push_back({x, i});
      }
    }
  }

  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 = z0 + 1; i < N; i++) do_remove(i);

  for (int p = (int)pairs.size() - 1; p >= 0; p--) {
    int x = pairs[p].first;
    int y = pairs[p].second;

    for (int k = y + 1; k < z0; k++) do_remove(k);

    for (int k = x + 1; k < y; k++) do_remove(k);

    do_remove(y);

    do_remove(x);
  }

  for (int i = 0; i < N; i++) {
    if (i == z0) continue;
    do_remove(i);
  }

  do_remove(z0);

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