Submission #1177169

#TimeUsernameProblemLanguageResultExecution timeMemory
1177169madamadam3Message (IOI24_message)C++20
0 / 100
178 ms844 KiB
#include "message.h"
#include <bits/stdc++.h>

using namespace std;

using vb = vector<bool>;
using vvb = vector<vb>;

// strategy 1 (should get 10 points for S <= 64)
// send S packets. if the majority of bits in a packet are 1, then M[i] = 1. else M[i] = 0
// we have 16 (majority) of bits to ourself, so strat always works

// strategy 2 (should get 29 ish points)
// same as strat 1, except we broadcast which bits are fine and which arent
// 31 messages to inform + 65 messages to broadcast = 96 total

// M = message to send, len(M) <= 1024
// C = bitmask of tainted bits, len(C) = 31
// if C[i] = 0, then that bit is safe, otherwise that bit isnt
// 15 unsafe, 16 safe

vb mask(vb C, vb bits) {
  while (bits.size() < 16) bits.push_back(false);

  int idx = 0;
  vb ans(31, false);
  for (int i = 0; i < 31; i++) {
    if (!C[i]) {
      ans[i] = bits[idx];
      idx++;
    }
  }

  return ans;
}

vb decode(vb C, vb bits) {
  vb M;
  for (int i = 0; i < 31; i++) {
    if (!C[i]) M.push_back(bits[i]);
  }

  return M;
}

vb int_to_vb(int inp) {
  vb ans(16, false);
  for (int i = 0; i < 16; i++) {
    ans[i] = inp & (1 << i);
  }
  return ans;
}

int vb_to_int(vb inp) {
  int ans = 0;
  for (int i = 0; i < 16; i++) {
    if (inp[i]) ans |= 1 << i;
  }

  return ans;
}

void send_message(vb M, vb C) {
  vb ZERO = vb(31, false);
  vb ONE = vb(31, true);

  for (int i = 0; i < 31; i++) {
    if (C[i] == false) send_packet(ZERO);
    else send_packet(ONE);
  }

  send_packet(mask(C, int_to_vb(M.size())));

  vb cur(16, false);
  for (int i = 0; i < M.size(); i++) {
    if ((i != 0 && i % 16 == 0) || i == M.size() - 1) {
      send_packet(mask(C, cur));
      cur = vb(16, false);
    }

    cur[i % 16] = M[i];
  }
}

vb receive_message(vvb R) {
  vb safe;
  vb M;

  for (int i = 0; i < 31; i++) {
    int ZEROS = 0; for (int j = 0; j < 31; j++) ZEROS += R[i][j] == false;
    if (ZEROS >= 16) safe.push_back(false);
    else safe.push_back(true);
  }

  int length = vb_to_int(decode(safe, R[31]));

  for (int i = 32; i < R.size(); i++) {
    vb out = decode(safe, R[i]);
    for (bool el : out) {
      if (M.size() >= length) break;
      M.push_back(el);
    }
  }

  return M;
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...