#include<vector>
#include<cstdio>
#include<set>
#include<cstdlib>
#include<cstdarg>
#include<cassert>
using namespace std;
#include "communication.h"
struct state {
int one = 0, two = 0;
vector<pair<int,int>> a, b;
};
void split (state &s, state &l, state &r) {
auto &[one, two, a, b] = s;
int left1 = (one + 1) / 2, left2 = two / 2;
for (auto [left, right] : a) {
if (right - left + 1 <= left1) l.a.push_back({left, right});
else if (left1 <= 0) r.a.push_back({left, right});
else l.a.push_back({left, left + left1 - 1}), r.a.push_back({left + left1, right});
left1 -= right - left + 1;
}
r.b = l.a, l.b = r.a;
for (auto [left, right] : b) {
if (right - left + 1 <= left2) l.a.push_back({left, right});
else if (left2 <= 0) r.a.push_back({left, right});
else l.a.push_back({left, left + left2 - 1}), r.a.push_back({left + left2, right});
left2 -= right - left + 1;
}
}
pair<int,int> div (state s, int x, int flag) {
auto &[one, two, a, b] = s;
for (auto [left, right] : a) one += right - left + 1;
for (auto [left, right] : b) two += right - left + 1;
if (one <= 2 and two <= 1) {
vector<int> v;
for (auto [left, right] : a) {
for (int i = left; i <= right; i++) v.push_back(i);
}
while (v.size() < 2) v.push_back(1 - flag);
for (auto [left, right] : b) {
for (int i = left; i <= right; i++) v.push_back(i);
}
while (v.size() < 3) v.push_back(1 - flag);
if (flag) {
if (x == v[0]) send(1), send(1);
else if (x == v[1]) send(1), send(0);
else send(0), send(0);
return {0, 0};
} else {
int ans = receive() * 2 + receive();
if (ans == 2 or ans == 3) return {v[0], v[1]};
else if (ans == 1) return {v[0], v[2]};
else return {v[1], v[2]};
}
}
state left, right;
split(s, left, right);
int signal = 1;
for (auto [l, r] : left.a) {
if (l <= x and x <= r) {signal = 0; break;}
}
int ans = 0;
if (flag) ans = send(signal);
else ans = receive();
if (ans == 0) return div(left, x, flag);
else return div(right, x, flag);
}
void encode (int n, int x) {
state s;
s.a.push_back({1, n});
div(s, x, 1);
}
pair<int,int> decode (int n) {
state s;
s.a.push_back({1, n});
return div(s, 0, 0);
}
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |