제출 #1177169

#제출 시각아이디문제언어결과실행 시간메모리
1177169madamadam3메시지 (IOI24_message)C++20
0 / 100
178 ms844 KiB
#include "message.h" #include <bits/stdc++.h> using namespace std; using vb = vector<bool>; using vvb = vector<vb>; // strategy 1 (should get 10 points for S <= 64) // send S packets. if the majority of bits in a packet are 1, then M[i] = 1. else M[i] = 0 // we have 16 (majority) of bits to ourself, so strat always works // strategy 2 (should get 29 ish points) // same as strat 1, except we broadcast which bits are fine and which arent // 31 messages to inform + 65 messages to broadcast = 96 total // M = message to send, len(M) <= 1024 // C = bitmask of tainted bits, len(C) = 31 // if C[i] = 0, then that bit is safe, otherwise that bit isnt // 15 unsafe, 16 safe vb mask(vb C, vb bits) { while (bits.size() < 16) bits.push_back(false); int idx = 0; vb ans(31, false); for (int i = 0; i < 31; i++) { if (!C[i]) { ans[i] = bits[idx]; idx++; } } return ans; } vb decode(vb C, vb bits) { vb M; for (int i = 0; i < 31; i++) { if (!C[i]) M.push_back(bits[i]); } return M; } vb int_to_vb(int inp) { vb ans(16, false); for (int i = 0; i < 16; i++) { ans[i] = inp & (1 << i); } return ans; } int vb_to_int(vb inp) { int ans = 0; for (int i = 0; i < 16; i++) { if (inp[i]) ans |= 1 << i; } return ans; } void send_message(vb M, vb C) { vb ZERO = vb(31, false); vb ONE = vb(31, true); for (int i = 0; i < 31; i++) { if (C[i] == false) send_packet(ZERO); else send_packet(ONE); } send_packet(mask(C, int_to_vb(M.size()))); vb cur(16, false); for (int i = 0; i < M.size(); i++) { if ((i != 0 && i % 16 == 0) || i == M.size() - 1) { send_packet(mask(C, cur)); cur = vb(16, false); } cur[i % 16] = M[i]; } } vb receive_message(vvb R) { vb safe; vb M; for (int i = 0; i < 31; i++) { int ZEROS = 0; for (int j = 0; j < 31; j++) ZEROS += R[i][j] == false; if (ZEROS >= 16) safe.push_back(false); else safe.push_back(true); } int length = vb_to_int(decode(safe, R[31])); for (int i = 32; i < R.size(); i++) { vb out = decode(safe, R[i]); for (bool el : out) { if (M.size() >= length) break; M.push_back(el); } } return M; }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...