Submission #1214522

#TimeUsernameProblemLanguageResultExecution timeMemory
1214522hyakupMessage (IOI24_message)C++20
76.16 / 100
423 ms864 KiB
#include "message.h"
#include <bits/stdc++.h>
using namespace std;

#define bug(x) cout << #x << " " << x << endl;

const int n = 31;
const int logm = 11;

vector<bool> encode( int x, int tam ){
  vector<bool> v(tam);
  for( int i = 0; i < tam; i++ ) if( x&(1<<i) ) v[i] = true;
  return v;
}

void init( int x ){
  vector<bool> v = encode( x, 5 );

  for( int i = 0; i < v.size(); i++ ){
    vector<bool> aux(n, v[i]);
    send_packet(aux);
  }
}

void send_message( vector<bool> m, vector<bool> c ){

  int id1;
  for( int i = 0; i < n; i++ ) if( !c[i] ) id1 = i;
  init( id1 );

  vector<vector<bool>> mat;

  int cont_cleo = 0;
  for( int i = 0; i < n && cont_cleo < 15 && i - cont_cleo < 16; i++ ){
    mat.push_back(vector<bool>(n));
    if( c[i] ) cont_cleo++;
    mat[i][id1] = c[i];
  }

  int iniciais = mat.size();

  vector<bool> message = encode( m.size(), logm );
  for( auto x : m ) message.push_back(x);

  int p = 0, linha = 0;
  while( p < message.size() ){
    if( linha == mat.size() ) mat.push_back(vector<bool>(n));
    for( int i = 0; i < n; i++ ) if( !c[i] && p < message.size() && !(i == id1 && linha < iniciais ) ) mat[linha][i] = message[p++];
    linha++;
  }

  for( auto &v  : mat ) send_packet(v);

}

int decode( vector<vector<bool>> &mat ){
  int x = 0;
  for( int i = 0; i < 5; i++ ){
    vector<int> cont(2);
    for( auto x : mat[i] ) cont[(int)x]++;
    if( cont[1] > cont[0] ) x += (1<<i);
  }
  return x;
}

vector<bool> receive_message( vector<vector<bool>> mat ){

  int id1 = decode(mat);

  vector<int> c(n);
  int cont_cleo = 0;
  int cur = 5;
  for( cur = 5; cur < n + 5 && cont_cleo < 15 && cur - 5 - cont_cleo < 16; cur++ ){
    c[cur - 5] = mat[cur][id1];
    if( c[cur - 5] ) cont_cleo++;
  }
  int iniciais = cur;

  if( cont_cleo < 15 ) for( int i = cur - 5; i < n; i++ ) c[i] = true;

  vector<bool> message;

  for( int linha = 5; linha < mat.size(); linha++ ){
    for( int i = 0; i < n; i++ ) if( !c[i] && !(i == id1 && linha < iniciais ) ) message.push_back(mat[linha][i]);
  }

  int qtd = 0;
  int p = 0;
  while( p < logm ){
    qtd += (message[p]<<p);
    p++;
  }

  vector<bool> resp;
  for( int i = logm; i < logm + qtd; i++ ) resp.push_back(message[i]);

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