Submission #1194520

#TimeUsernameProblemLanguageResultExecution timeMemory
1194520aykhnMessage (IOI24_message)C++20
66.72 / 100
416 ms864 KiB
#include "message.h"
#include <bits/stdc++.h>

using namespace std;

int o[31] = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30};

// int o[31] = {9, 17, 7, 27, 10, 22, 21, 6, 30, 3, 24, 15, 29, 19, 2, 13, 23, 20, 14, 1, 25, 5, 4, 8, 0, 16, 18, 28, 11, 12, 26};

int calc(vector<bool> C)
{
  int res = 0;
  vector<int> unlock;
  for (int i = 0; i < 31 && unlock.size() < 16;)
  {
    if (31 - i == 16 - (int)unlock.size())
    {
      for (int j = i; j < 31; j++) unlock.push_back(o[j]);
      break;
    }
    vector<bool> v;
    if (unlock.empty())
    {
      if (C[o[i]] == 0) v = vector<bool>(31, 1);
      else v = vector<bool>(31, 0);
      res++;
      if (v.back()) unlock.push_back(o[i]);
      i++;
      continue;
    }
    v = vector<bool>(31, 0);
    int j = 0;
    while (i < 31 && j < unlock.size())
    {
      if (C[o[i]] == 0) v[unlock[j]] = 1, unlock.push_back(o[i]);
      else v[unlock[j]] = 0;
      i++, j++;
    }
    res++;
  }
  return res;
}

void send_message(vector<bool> M, vector<bool> C) 
{
  int n = M.size();
  int A = calc(C);
  reverse(o, o + 31);
  int B = calc(C);
  reverse(o, o + 31);
  if (A <= B) send_packet(vector<bool>(31, 0));
  else 
  {
    reverse(o, o + 31);
    send_packet(vector<bool>(31, 1));
  }
  vector<int> unlock;
  for (int i = 0; i < 31 && unlock.size() < 16;)
  {
    if (31 - i == 16 - (int)unlock.size())
    {
      for (int j = i; j < 31; j++) unlock.push_back(o[j]);
      break;
    }
    vector<bool> v;
    if (unlock.empty())
    {
      if (C[o[i]] == 0) v = vector<bool>(31, 1);
      else v = vector<bool>(31, 0);
      send_packet(v);
      if (v.back()) unlock.push_back(o[i]);
      i++;
      continue;
    }
    v = vector<bool>(31, 0);
    int j = 0;
    while (i < 31 && j < unlock.size())
    {
      if (C[o[i]] == 0) v[unlock[j]] = 1, unlock.push_back(o[i]);
      else v[unlock[j]] = 0;
      i++, j++;
    }
    send_packet(v);
  }
  {
    vector<bool> v(31, 0);
    for (int i = 0; i <= 10; i++) v[unlock[i]] = (n >> i & 1);
    send_packet(v);
  }
  for (int i = 0; i < (n + 15) / 16; i++)
  {
    vector<bool> v(31, 0);
    for (int j = 0; j < 16; j++)
    {
      if (i * 16 + j >= n) break;
      v[unlock[j]] = M[i * 16 + j];
    }
    send_packet(v);
  }
  if (A > B) reverse(o, o + 31);
}

vector<bool> receive_message(vector<vector<bool>> R) 
{
  vector<int> unlock;
  int cur = -1;
  auto nxt = [&]()
  {
    return R[++cur];
  };
  auto get = [&](vector<bool> A)
  {
    int cnt = 0;
    for (auto i : A) cnt += (int)i;
    return cnt >= 16;
  };
  vector<bool> F = nxt();
  if (get(F)) reverse(o, o + 31);
  for (int i = 0; i < 31 && unlock.size() < 16;)
  {
    if (31 - i == 16 - (int)unlock.size())
    {
      for (int j = i; j < 31; j++) unlock.push_back(o[j]);
      break;
    }
    vector<bool> v = nxt();
    if (unlock.empty())
    {
      if (get(v)) unlock.push_back(o[i]);
      i++;
      continue;
    }
    int j = 0;
    while (i < 31 && j < unlock.size())
    {
      if (v[unlock[j]] == 1) unlock.push_back(o[i]);
      i++, j++;
    }
  }
  vector<bool> sz = nxt();
  int n = 0;
  for (int i = 0; i <= 10; i++) 
  {
    if (sz[unlock[i]]) n |= (1 << i);
  }
  vector<bool> res(n, 0);
  for (int i = 0; i < (n + 15) / 16; i++)
  {
    vector<bool> v = nxt();
    for (int j = 0; j < 16; j++)
    {
      if (i * 16 + j >= n) break;
      res[i * 16 + j] = v[unlock[j]];
    }
  }
  if (get(F)) reverse(o, o + 31);
  return res;
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...