Submission #1217705

#TimeUsernameProblemLanguageResultExecution timeMemory
1217705dostsMessage (IOI24_message)C++20
10 / 100
414 ms848 KiB
#include "message.h"
#include <bits/stdc++.h>
#pragma GCC optimize("O3,unroll-loops")
#pragma GCC target("avx2")
//#define int long long
#define pii pair<int,int>
#define vi vector<int>
#define ff first
#define ss second
#define sp << " " <<
#define all(x) x.begin(),x.end()
#define big(x) ((int)(x.size()))
using namespace std;

void send_message(std::vector<bool> M, std::vector<bool> C) {
  std::vector<bool> A(31, 0);
  vi clean;
  for (int i = 0;i<31;i++) if (!C[i]) clean.push_back(i); 
  int fbit = clean[0];
  for (int i = 0;i<4;i++) send_packet(vector<bool>(31,!!(fbit&(1<<i))));
  int ptr = 0;
  int nxt = 0;
  for (int i = 0;i<30;i++) {
    if (nxt == fbit) nxt++;
    vector<bool> A(31,0);
    for (int j = 1;j<16;j++) A[clean[j]] = M[ptr++];
    A[fbit] = C[nxt++];
    send_packet(A);
  }
  int  S = big(M);
  vector<bool> szpack(31,0);
  for (int i = 0;i<16;i++) szpack[clean[i]] = !!(S&(1<<i));
  send_packet(szpack);
  for (int i = 0;ptr < S;i++) {
    vector<bool> A(31,0);
    for (auto it : clean) {
      if (ptr == S) break;
      A[it] = M[ptr++];
    }
    send_packet(A);
  }
}

std::vector<bool> receive_message(std::vector<std::vector<bool>> R) {
  int fbit = 0;
  int cur = 0;
  for (int i = 0;i<4;i++) {
    int o = 0,z = 0;
    for (auto it : R[cur]) {
      if (it) o++;
      else z++;
    }
    if (o > z) fbit+=1<<i;
    cur++;
  }
  int nxt = 0;
  vi clean{fbit};
  for (int i = 0;i<30;i++) {
    if (nxt == fbit) nxt++;
    if (!R[cur+i][fbit]) clean.push_back(nxt);
    nxt++;
  }
  int s = 0;
  for (int i = 0;i<big(clean);i++) {
    if (R[cur+30][clean[i]]) s+=(1<<i);
  }

  vector<bool> msg(s);
  int ptr = 0;
  for (int i = 0;ptr < s && i< 30;i++) {
    for (auto it : clean) {
      if (it == fbit) continue;
      msg[ptr++] = R[cur+i][it];
    }
  }
  cur+=31;
  for (int i = 0;ptr < s;i++) {
    for (auto it : clean) {
      if (ptr == s) break;
      msg[ptr++] = R[cur][it];
    }
    cur++;
  }
  return msg;
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...