Submission #829534

#TimeUsernameProblemLanguageResultExecution timeMemory
829534QwertyPiFlight to the Ford (BOI22_communication)C++17
92 / 100
2282 ms2112 KiB
#include"communication.h" #include <bits/stdc++.h> using namespace std; // // --- Sample implementation for the task communication --- // // To compile this program with the sample grader, place: // communication.h communication_sample.cpp sample_grader.cpp // in a single folder, then open the terminal in this directory (right-click onto an empty spot in the directory, // left click on "Open in terminal") and enter e.g.: // g++ -std=c++17 communication_sample.cpp sample_grader.cpp // in this folder. This will create a file a.out in the current directory which you can execute from the terminal // as ./a.out // See task statement or sample_grader.cpp for the input specification // void encode(int N, int X) { int B = __lg(N + 1) + 1; mt19937 rng; rng.seed(1337); vector<int> bits; for(int j = 0; j < B; j++) bits.push_back(j); for(int i = 0; i < B; i++) swap(bits[i], bits[rng() % (i + 1)]); vector<int> a; for(int j = 0; j < B; j++) a.push_back((X & (1 << j)) > 0); int prv = -1, prv_val = 0; while(bits.size() >= 2){ int b1 = bits.back(); bits.pop_back(); int b2 = bits.back(); bits.pop_back(); int s1 = prv != -1 ? prv_val : send(a[b1]); int s2 = send(a[b2]); int s3 = send(a[b2]); prv = -1; if(s2 == s3){ bits.push_back(b1); continue; } int s4 = send(a[b1]); if(s1 == s4){ bits.push_back(b2); }else{ bits.push_back(b1); prv = b1; prv_val = s4; } } } struct DSU{ int dsu[71]; void init(){ for(int i = 0; i < 71; i++) dsu[i] = i; } int f(int x){ return x == dsu[x] ? x : dsu[x] = f(dsu[x]); } void g(int x, int y){ x = f(x), y = f(y); dsu[x] = y; } } dsu; void link(int u, int v, bool b){ dsu.g(u * 2, v * 2 + b); dsu.g(u * 2 + 1, v * 2 + !b); } std::pair<int, int> decode(int N) { int B = __lg(N + 1) + 1; mt19937 rng; rng.seed(1337); vector<int> bits; for(int j = 0; j < B; j++) bits.push_back(j); for(int i = 0; i < B; i++) swap(bits[i], bits[rng() % (i + 1)]); vector<int> a; dsu.init(); int prv = -1, prv_val = 0; while(bits.size() >= 2){ int b1 = bits.back(); bits.pop_back(); int b2 = bits.back(); bits.pop_back(); int s1 = prv != -1 ? prv_val : receive(); int s2 = receive(); int s3 = receive(); prv = -1; if(s2 == s3){ link(b2, B, s2); bits.push_back(b1); continue; } int s4 = receive(); if(s1 == s4){ link(b1, B, s1); bits.push_back(b2); }else{ link(b1, b2, s1 ^ s2 ^ 1); bits.push_back(b1); prv = b1; prv_val = s4; } } int sp = bits[0]; vector<int> ans; for(int i = 0; i < 2; i++){ int r = 0; for(int j = 0; j < B; j++){ bool y = dsu.f(j * 2) == dsu.f(B * 2 + 1) || dsu.f(j * 2) == dsu.f(sp * 2 + (1 - i)); r += (1 << j) * y; } ans.push_back(r); } if(ans[0] < 1 || ans[0] > N) ans[0] = 1; if(ans[1] < 1 || ans[1] > N) ans[1] = 1; return {ans[0], ans[1]}; }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...