제출 #1353506

#제출 시각아이디문제언어결과실행 시간메모리
1353506adam17Flight to the Ford (BOI22_communication)C++20
48.67 / 100
1063 ms3084 KiB
// #include <iostream>

#include <utility>
int send(int s);
int receive();

void encode(int N, int X) {
    // std::cout << "encode(" << N << ", " << X << ");\n";
    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((s0 + s1 == 0) ? (3 * a) : (N - 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;
            }
        }
        // std::cout << "decode(" << N << ") = {" << values.first << "," << values.second << "}\n";
        return values;
    }
}
#결과 실행 시간메모리채점기 출력
결과를 불러오는 중입니다…
#결과 실행 시간메모리채점기 출력
결과를 불러오는 중입니다…