제출 #1231530

#제출 시각아이디문제언어결과실행 시간메모리
1231530banganMessage (IOI24_message)C++20
43.96 / 100
445 ms864 KiB
#include "message.h"
#include <bits/stdc++.h>
using namespace std;

#define pb push_back

const int N = 31;

void send_message(std::vector<bool> M, std::vector<bool> C) {
    vector<int> ok;
    for (int i=0; i<N && ok.size() != 16;) {
        if (ok.empty()) {
            send_packet(vector<bool>(N, C[i]));
            if (!C[i]) ok.pb(i);
            i++;
        }
        else {
            vector<bool> pac(N, false);
            int j = 0;
            while (j < ok.size() && i+j < N) {
                pac[ok[j]] = C[i+j];
                j++;
            }
            send_packet(pac);
        
            for (int k=i; k < i+j; k++) if (!C[k]) ok.pb(k);
            i+=j;
        }
    }

    auto cur = ok.begin();
    vector<bool> pac(31, false);
    for (bool x : M) {
        if (cur==ok.end()) {
            send_packet(pac);
            pac = vector<bool>(31, false);
            cur = ok.begin();
        }
        pac[*cur] = x;
        cur++;
    }

    if (cur == ok.end()) {
        send_packet(pac);
        pac = vector<bool>(31, false);
        cur = ok.begin();
    }
    pac[*cur] = true;
    send_packet(pac);
}

std::vector<bool> receive_message(std::vector<std::vector<bool>> R) {
    reverse(R.begin(), R.end());

    vector<bool> C(N, true);
    vector<int> ok;

    int i;
    for (i=0; i<N && ok.size() != 16;) {
        auto vec = R.back();
        R.pop_back();

        if (ok.empty()) {
            int cnt[2] {};
            for (bool x : vec) cnt[x]++;
            if (cnt[0]<cnt[1]) C[i]=1;
            else C[i]=0, ok.pb(i);
            i++;
        }
        else {
            int j = 0;
            while (j < ok.size() && i+j < N) {
                C[i+j] = vec[ok[j]];
                j++;
            }

            for (int k=i; k < i+j; k++) if (!C[k]) ok.pb(k);
            i+=j;
        }
    }
    reverse(R.begin(), R.end());

    vector<bool> M;
    for (i=0; i+1 < R.size(); i++) {
        auto vec = R[i];
        for (int j=0; j<N; j++) if (!C[j]) M.pb(vec[j]);
    }

    auto vec = R.back();
    int lst=0;
    for (i=0; i<N; i++) if (!C[i] && vec[i]) lst=i;

    for (i=0; i<lst; i++) if (!C[i]) M.pb(vec[i]);
    return M;
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...