제출 #1353499

#제출 시각아이디문제언어결과실행 시간메모리
1353499adam17Flight to the Ford (BOI22_communication)C++20
15 / 100
99 ms2888 KiB
#include <utility>
int send(int s);
int receive();

void encode(int N, int X) {
    if (N == 3) {
        send((X == 3) ? 1 : 0);
        send((X == 2) ? 1 : 0);
        send((X == 2) ? 1 : 0);
        send((X == 3) ? 1 : 0);
    } else {
        int a = N / 4, s0, s1;
        if (X < a) {
            s0 = send(0);
            s1 = send(0);
        } else if (X < 2 * a) {
            s0 = send(0);
            s1 = send(1);
        } else if (X < 3 * a) {
            s0 = send(1);
            s1 = send(0);
        } else {
            s0 = send(1);
            s1 = send(1);
        }
        if (s0) {
            if (s1) {
                encode(N - a, X - a);
            } else {
                encode(N - a, X - ((X > a) ? a : 0));
            }
        } else {
            if (s1) {
                encode(N - a, X - ((X > 2 * a) ? a : 0));
            } else {
                encode(3 * a, X);
            }
        }
    }
}

std::pair<int,int> decode(int N) {
    if (N == 3) {
        int a = receive(), b = receive(), c = receive(), d = receive();
        if ((a + b + c + d == 0) || (a > b) || (c < d)) {
            return std::pair<int,int>{1, 3};
        }
        if ((a < b) || (c > d)) {
            return std::pair<int,int>{1, 2};
        }
        return std::pair<int,int>{2, 3};
    } else {
        int a = N / 4, s0 = receive(), s1 = receive();
        std::pair<int, int> values = decode(3 * a);
        if (s0) {
            if (s1) {
                values.first += a;
                values.second += a;
            } else {
                if (values.first > a) values.first += a;
                if (values.second > a) values.second += a;
            }
        } else {
            if (s1) {
                if (values.first > 2 * a) values.first += a;
                if (values.second > 2 * a) values.second += a;
            }
        }
        return values;
    }
}
#결과 실행 시간메모리채점기 출력
결과를 불러오는 중입니다…
#결과 실행 시간메모리채점기 출력
결과를 불러오는 중입니다…