제출 #1184778

#제출 시각아이디문제언어결과실행 시간메모리
1184778Seb메시지 (IOI24_message)C++20
0 / 100
224 ms844 KiB
#include <bits/stdc++.h>
#include "message.h"

using namespace std;

typedef long long ll;

void send_message(std::vector<bool> M, std::vector<bool> C) {
    for (int i = 0; i < 31; i++) C[i] = !C[i];

    vector<bool> A(31, false), B(31, true);
    for (int i = 0; i < 31; i++) {
        if (C[i] == false) send_packet(A);
        else { send_packet(B); break; }
    }

    ll idx = 0, aux_idx = 0;
    while (C[idx] == false) idx++;

    aux_idx = idx + 1;

    while (idx < 30) {
        A = vector<bool> (31, false);

        for (int i = 0; i <= idx; i++)
            if (C[i]) if (aux_idx < 31) A[i] = C[aux_idx++];

        idx = aux_idx - 1;
        send_packet(A);
    }

    A = vector<bool> (31, false);
    ll SZ = M.size();
    for (int i = 0; i < 31; i++) {
        if (C[i]) {
            A[i] = ((SZ%2 == 0) ? false : true);
            SZ /= 2;
        }
        send_packet(A);
    }

    idx = 0;
    while (idx < M.size()) {
        A = vector<bool> (31, false);
        for (int i = 0; i < 31; i++)
            if (C[i]) A[i] = M[idx++];
        send_packet(A);
    }

    return;
}

std::vector<bool> receive_message(std::vector<std::vector<bool>> R) {
    vector<bool> C(31, false), V;
    ll idx = 0, SZ = 0;
    for (auto &it : R) {
        ll cnt = 0;

        for (int i = 0; i < 31; i++) {
            if (it[i]) cnt++;
            if (C[i]) V.push_back(it[i]);
        }

        if (idx < 31) {
            if (V.empty()) C[idx++] = ((cnt > 15) ? true : false);
            else for (int i = 0; i < V.size(); i++) if (idx < 31) C[idx++] = V[i];
            V.clear();
        }
        if (idx == 31) {
            ll aux = 1;
            for (int i = 0; i < V.size(); i++) {
                SZ += aux*(V[i] == true ? 1 : 0);
                aux *= 2;
            }
            V.clear();
            idx++;
        }
    }

    while (V.size() > SZ) V.pop_back();

    return V;
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...