Submission #1214488

#TimeUsernameProblemLanguageResultExecution timeMemory
1214488hyakupMessage (IOI24_message)C++20
30.33 / 100
526 ms856 KiB
#include "message.h"
#include <bits/stdc++.h>
using namespace std;

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

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

void send_message( vector<bool> m, vector<bool> c ){
  int cont_cleo = 0;
  for( int i = 0; i < n && cont_cleo < 15 && i - cont_cleo < 16; i++ ){
    if( c[i] ) cont_cleo++;
    vector<bool> v(n, c[i]);
    send_packet(v);
  }

  vector<bool> num = encode(m.size());
  vector<bool> qtd(n);
  for( int i = 0; i < n; i++ ) if( !c[i] && !num.empty() ){ qtd[i] = num.back(); num.pop_back(); }


  send_packet(qtd);
  int p = 0;
  while( p < m.size() ){
    vector<bool> v(n);
    for( int i = 0; i < n; i++ ) if( !c[i] && p < m.size() ) v[i] = m[p++];
    send_packet(v);
  }
}

vector<bool> receive_message( vector<vector<bool>> mat ){
  vector<int> c(n);
  int cont_cleo = 0;
  int cur = 0;
  for( cur = 0; cur < n && cont_cleo < 15 && cur - cont_cleo < 16; cur++ ){
    vector<int> cont(2);
    for( auto x : mat[cur] ) cont[(int)x]++;
    c[cur] = ((cont[1] > cont[0]) ? true : false );
    if( c[cur] ) cont_cleo++;
  }

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

  int qtd = 0, cont = 0;
  for( int i = 0; i < n; i++ ) if( !c[i] && cont < logm ){
    cont++;
    qtd = (qtd<<1) + (int)mat[cur][i];
  }


  vector<bool> resp;
  while( ++cur < mat.size() ){
    for( int i = 0; i < n; i++ ) if( !c[i] && resp.size() < qtd ) resp.push_back(mat[cur][i]);
  }
  return resp;
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...