제출 #1336298

#제출 시각아이디문제언어결과실행 시간메모리
1336298apxoMessage (IOI24_message)C++20
0 / 100
352 ms816 KiB
#include "bits/stdc++.h"

using namespace std;

#include "message.h"

#ifdef duc_debug
#include "bits/debug.h"
#else
#define debug(...)
#endif

void send_message(vector<bool> m, vector<bool> c) {
  vector<vector<bool>> pkg(66, vector<bool>(31, 0));
  bool x = m.back() ^ 1;
  while ((int)m.size() < 1025) m.push_back(x);
  for (int i = 0; i < 31; ++i) {
    if (c[i]) continue;
    int cnt = 1;
    int nxt = (i + 1) % 31;
    while (c[nxt]) {
      ++cnt;
      nxt = (nxt + 1) % 31;
    }
    for (int j = 0; j < cnt - 1; ++j) pkg[j][i] = 0;
    pkg[cnt - 1][i] = 1;
  }
  vector<bool> free(31);
  int ptr = 0;
  for (int i = 0; i < 66; ++i) {
    for (int j = 0; j < 31; ++j) {
      if (pkg[i][j]) {
        free[j] = 1;
        continue;
      }
      if (free[j]) {
        if (ptr < 1025) {
          pkg[i][j] = m[ptr++];
        }
      }
    }
  }
  for (int i = 0; i < 66; ++i) {
    send_packet(pkg[i]);
  }
}

vector<bool> receive_message(vector<vector<bool>> pkg) {
  vector<int> nxt(31, -1);
  for (int j = 0; j < 31; ++j) {
    nxt[j] = j;
    for (int i = 0; i < 66; ++i) {
      if (pkg[i][j]) {
        nxt[j] = (j + i + 1) % 31;
        break;
      }
    }
  }
  int vx = -1;
  vector<bool> vis(31);
  for (int i = 0; i < 31; ++i) {
    if (vis[i]) continue;
    int cc = 0;
    int cur = i;
    while (true) {
      ++cc;
      vis[cur] = 1;
      if (vis[nxt[cur]]) break;
      cur = nxt[cur];
    }
    if (cc == 16) {
      vx = i;
      break;
    }
  }
  vis = vector<bool>(31, 0);
  vector<int> cd;
  while (true) {
    cd.push_back(vx);
    vis[vx] = 1;
    if (vis[nxt[vx]]) break;
    vx = nxt[vx];
  }
  sort(cd.begin(), cd.end());
  vector<bool> free(31);
  vector<bool> res;
  for (int i = 0; i < 66; ++i) {
    for (int j = 0; j < 31; ++j) {
      if (!vis[j]) continue;
      if (pkg[i][j]) {
        free[j] = 1;
        continue;
      }
      if (free[j]) {
        if ((int)res.size() < 1025) {
          res.push_back(pkg[i][j]);
        }
      }
    }
  } 
  bool x = res.back();
  while (res.back() == x) res.pop_back();
  return res;
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...