Submission #1177173

#TimeUsernameProblemLanguageResultExecution timeMemory
1177173madamadam3Message (IOI24_message)C++20
0 / 100
187 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) { int S = (int) M.size(); 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(S))); vb cur; for (int i = 0; i < S; i++) { if ((i != 0 && i % 16 == 0) || i == S - 1) { if (i == S - i) cur.push_back(M[i]); send_packet(mask(C, cur)); cur = vb(); } cur.push_back(M[i]); } } vb receive_message(vvb R) { int packets = (int) R.size(); 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 < packets; i++) { vb out = decode(safe, R[i]); for (bool el : out) { M.push_back(el); } } vb nM; for (int i = 0; i < length; i++) nM.push_back(M[i]); return nM; }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...