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...