Submission #1133400

#TimeUsernameProblemLanguageResultExecution timeMemory
1133400TAhmed33Message (IOI24_message)C++20
40.65 / 100
459 ms860 KiB
#include "message.h"
//#include "grader.cpp"
#include <bits/stdc++.h>
using namespace std;
#pragma GCC optimize ("Ofast")
const int B = 31;
void send_message (vector <bool> m, vector <bool> c) {
  int u = 0, v = 0;
  vector <int> z;
  for (int i = 0; i < (int)c.size(); i++) {
    send_packet(vector <bool> (B, c[i])); 
    if (!c[i]) {
      z.push_back(i);
    }
    u += c[i]; v += !c[i];
    if (u == 15) {
      break;
    }
    if (v == 2) {
      for (int j = i + 1; j < (int)c.size(); j += 2) {
        vector <bool> t(B, false);
        t[z[0]] = c[j];
        if (j != (int)c.size() - 1) {
          t[z[1]] = c[j + 1];
        }
        send_packet(t);
      }
      break;
    }
    if (v == 16) {
      break;
    }
    if (v == 15 && i == (int)c.size() - 2) {
      break;
    }
  }
  bool flag = 0;
  if (m.back() == 0) {
    flag = 1;
    for (int i = 0; i < (int)m.size(); i++) {
      m[i] = !m[i];
    }
  }
  int ii[16], x = 0;
  for (int i = 0; i < B; i++) {
    if (!c[i]) {
      ii[x++] = i;
    }
  }
  for (int i = 0; i < (int)m.size(); i += 16) {
    vector <bool> e(B, false);
    for (int j = i; j < min((int)m.size(), i + 16); j++) {
      e[ii[j - i]] = m[j];
    }
    send_packet(e);
  }
  send_packet(vector <bool> (B, flag));
  return;
}
int majority (vector <bool> &x) {
  int c[2] = {};
  for (auto i : x) {
    c[i]++;
  }
  if (c[0] < c[1]) return 1;
  else return 0;
}
vector <bool> receive_message (vector <vector <bool>> R) {
  int C[B] = {};
  int u = 0, v = 0;
  int ind = -1;
  vector <int> z;
  for (int i = 0; i < B; i++) {
    C[i] = majority(R[i]);
    if (!C[i]) {
      z.push_back(i);
    }
    u += C[i]; v += !C[i];
    ind = i;
    if (u == 15 || (v == 15 && i == B - 2)) {
      for (int j = i + 1; j < B; j++) {
        C[j] = 0;
      }
      break;
    }
    if (v == 2) {
      int x = ind + 1;
      while (x < B) {
        ind++;
        C[x] = R[ind][z[0]];
        if (x != B - 1) {
          C[x + 1] = R[ind][z[1]];
        }
        x += 2;
      }
      break;
    }
    if (v == 16) {
      for (int j = i + 1; j < B; j++) {
        C[j] = 1;
      }
      break;
    }
  }
  vector <bool> m;
  for (int i = ind + 1; i + 1 < (int)R.size(); i++) {
    for (int j = 0; j < B; j++) {
      if (!C[j]) m.push_back(R[i][j]);
    }
  }
  while (m.back() == 0) {
    m.pop_back();
  }
  if (majority(R.back())) {
    for (int i = 0; i < (int)m.size(); i++) {
      m[i] = !m[i];
    }
  }
  return m;
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...