제출 #1315332

#제출 시각아이디문제언어결과실행 시간메모리
1315332ezzzay메시지 (IOI24_message)C++17
0 / 100
378 ms808 KiB
#include "message.h" #include <bits/stdc++.h> using namespace std; static vector<bool> toBoolVec(const vector<int>& v){ vector<bool> r(v.size()); for(size_t i=0;i<v.size();++i) r[i] = (v[i] != 0); return r; } void send_message(vector<bool> M_bool, vector<bool> C_bool) { vector<int> M; for(bool b : M_bool) M.push_back(b ? 1 : 0); vector<int> C(31); for(int i=0;i<31;i++) C[i] = C_bool[i] ? 1 : 0; int x = -1; for(int i=0;i<31;i++) if(C[i] == 0) { x = i; break; } if(x == -1) x = 0; x &= 31; for(int i=0;i<5;i++){ int bit = (x >> i) & 1; vector<int> v(31, bit); send_packet(toBoolVec(v)); } vector<int> msg; int S = (int)M.size(); int z = 1025 - S - 1; for(int i=0;i<z;i++) msg.push_back(0); msg.push_back(1); for(int b : M) msg.push_back(b); vector<int> safeIdx; for(int j=0;j<31;j++) if(C[j] == 0 && j != x) safeIdx.push_back(j); int ptr = 0; for(int i=0;i<31;i++){ vector<int> v(31, 0); v[x] = C[i]; for(int s = 0; s < (int)safeIdx.size() && ptr < (int)msg.size(); ++s){ int j = safeIdx[s]; v[j] = msg[ptr++]; } send_packet(toBoolVec(v)); } while(ptr < (int)msg.size()){ vector<int> v(31, 0); v[x] = 0; for(int s = 0; s < (int)safeIdx.size() && ptr < (int)msg.size(); ++s){ int j = safeIdx[s]; v[j] = msg[ptr++]; } send_packet(toBoolVec(v)); } } vector<bool> receive_message(vector<vector<bool>> Rb) { int P = (int)Rb.size(); if(P == 0) return {}; vector<vector<int>> R(P, vector<int>(31,0)); for(int i=0;i<P;i++) for(int j=0;j<31 && j<(int)Rb[i].size(); ++j) R[i][j] = Rb[i][j] ? 1 : 0; if(P < 5) return {}; int x = 0; for(int i=0;i<5;i++){ int ones = 0; for(int j=0;j<31;j++) ones += R[i][j]; if(ones >= 16) x |= (1<<i); } x &= 31; if(x < 0 || x >= 31) x = x % 31; vector<int> C(31,1); if(P >= 5 + 31){ for(int i=0;i<31;i++){ C[i] = R[5 + i][x]; } } else { int available = max(0, P - 5); for(int i=0;i<available && i<31;i++) C[i] = R[5 + i][x]; for(int i=available;i<31;i++) C[i] = 1; } vector<int> safeIdx; for(int j=0;j<31;j++) if(C[j] == 0 && j != x) safeIdx.push_back(j); vector<int> msg; for(int i=5;i<P;i++){ for(int s=0;s<(int)safeIdx.size(); ++s){ int j = safeIdx[s]; msg.push_back(R[i][j]); } } int pos = 0; while(pos < (int)msg.size() && msg[pos] == 0) pos++; if(pos >= (int)msg.size()) return {}; pos++; vector<bool> M; for(int i=pos;i<(int)msg.size(); ++i) M.push_back(msg[i] ? true : false); return M; }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...