Submission #1099067

#TimeUsernameProblemLanguageResultExecution timeMemory
1099067crafticatFlight to the Ford (BOI22_communication)C++17
0 / 100
30 ms2748 KiB
#include <bits/stdc++.h> using namespace std; #define F0R(i, n) for (int i= 0; i < n;i++) template<typename T> using V = vector<T>; using vi = V<int>; int send(int bit); int receive(); constexpr int TRIES = 10; void sendBit(int x) { bool lied = false; bool finished = false; F0R(i, TRIES) { if (finished) { send(1); continue; } if (lied) { send(x); finished = true; continue; } if (send(1) == 0) lied = true; } if (!lied) send(x); else send(1); } int recBit() { bool next = false; bool finished = false; int ans = 0; F0R(i, TRIES) { int x = receive(); if (finished) continue; if (next) { finished = true; ans = x; continue; } if (x == 0) next = true; } int y = receive(); if (!finished) ans = y; return ans; } void encode(int n, int x) { srand(time(nullptr)); int bits = log2(n + 1) + 1; F0R(i, bits) { sendBit(x % 2); x /= 2; } } std::pair<int, int> decode(int n) { int x = 0; int bits = log2(n + 1) + 1; int mul = 1; F0R(i, bits) { x += mul * recBit(); mul *= 2; } return {x, n}; } #if DEBUG using namespace std; void __attribute__((noreturn)) __attribute__((format(printf, 1, 2))) result(const char *msg, ...) { va_list args; va_start(args, msg); vfprintf(stdout, msg, args); fprintf(stdout, "\n"); va_end(args); exit(0); } namespace { enum { ENCODE, DECODE } current_phase; int N, X; vector<int> signals; size_t cursor = 0; bool flipped = false; } int send(int s) { if(current_phase == DECODE or (s != 0 and s != 1)) result("Invalid send."); printf("send(%d) -> ", s); fflush(stdout); int answer = flipped ? s : rand() % 2; bool flipped_now = (s != answer); if(flipped and flipped_now) result("Invalid reply to send"); flipped = flipped_now; signals.push_back(answer); if(signals.size() > (size_t) 250) result("Looks (and smells) fishy."); return signals.back(); } int receive() { if(current_phase == ENCODE) result("Invalid receive."); if(cursor >= signals.size()) result("Assistant waiting for Godot."); int r = signals[cursor++]; printf("receive() -> %d\n", r); return r; } int main() { if(scanf("%d %d", &N, &X) != 2 or X < 1 or X > N) result("Invalid input."); current_phase = ENCODE; encode(N, X); current_phase = DECODE; auto r = decode(N); if(r.first < 1 or r.first > N or r.second < 1 or r.second > N) result("Invalid answer."); if(r.first == X or r.second == X) result("Correct: %d signals sent.", (int) signals.size()); else result("Wrong answer."); } #endif
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...