Submission #1242606

#TimeUsernameProblemLanguageResultExecution timeMemory
1242606fskarica메시지 (IOI24_message)C++20
30.33 / 100
562 ms856 KiB
#include <bits/stdc++.h>
//#include "message.h"

using namespace std;

#define ll long long
#define fi first
#define se second
#define pii pair<int, int>

//vector <vector<bool>> bla;
//std::vector<bool> send_packet(std::vector<bool> A) {
//    bla.push_back(A);
//    return A;
//}

std::vector<bool> send_packet(std::vector<bool> A);

void send_message(std::vector<bool> M, std::vector<bool> C) {
    vector <bool> zero, one;

    for (int i = 0; i < 31; i++) {
        zero.push_back(0);
        one.push_back(1);
    }

    for (int i = 0; i < 30; i++) {
        if (C[i] == 0) send_packet(zero);
        else send_packet(one);
    }

    int n = M.size();
    vector <bool> sz(31, 0);
    for (int i = 30; i >= 0; i--) {
        if (C[i]) continue;

        if (n % 2) sz[i] = 1;
        n /= 2;
    }
    send_packet(sz); /// this sends how long is M

    int pos = 0;
    vector <bool> msg(31, 0);
    for (auto e : M) {
        while (pos < 31 && C[pos]) pos++;
        if (pos == 31) {
            pos = 0;
            send_packet(msg);
            for (int i = 0; i < 31; i++) msg[i] = 0;
        }
        while (pos < 31 && C[pos]) pos++;

        if (e) msg[pos] = 1;
        pos++;
    }

    if (pos != 0) send_packet(msg);
}

std::vector<bool> receive_message(std::vector<std::vector<bool>> R) {
    vector <int> C(31, 0);

//    cout << R.size() << " rsize()\n";

    int cnt0 = 0, cnt1 = 0;
    for (auto e : R) {
        if (cnt0 + cnt1 == 30) break;

        int cntOne = 0, cntZero = 0;
        for (auto e2 : e) {
            if (e2 == 0) cntZero++;
            else cntOne++;
        }

        if (cntOne < cntZero) cnt0++;
        else cnt1++, C[cnt0 + cnt1 - 1] = 1;
    }
    if (cnt1 < 15) C[30] = 1;

//    cout << "C - "; for (int i = 0; i < 31; i++) cout << C[i] << " "; cout << "\n";

    int sz = 0;
    int cnt = 0;
    for (int i = 30; i >= 0; i--) {
        if (C[i]) continue;
        sz += R[30][i] * (1 << cnt);
        cnt++;
    }

//    cout << "sz - " << sz << "\n";

    vector <bool> ret;
    cnt = 0;
    for (int i = 31; i < R.size(); i++) {
        for (int j = 0; j < 31; j++) {
            if (cnt == sz) continue;
            if (C[j]) continue;

            int x = R[i][j];
            ret.push_back(x);
            cnt++;
        }
    }

    return ret;
}

//int main() {
//    send_message({0, 0, 1, 1, 0, 1, 1, 1, 1, 1, 0, 1, 0, 0, 1, 1, 0, 1, 0, 0, 1, 1, 0, 0}, {0, 1, 1, 0, 1, 1, 1, 0, 0, 0, 0, 1, 0, 1, 1, 0, 1, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 1, 1, 0, 1});
////    cout << bla.size() << " bla size\n\n";
//
//    vector <bool> sol = receive_message(bla);
//    cout << "sol - "; for (auto e : sol) cout << e << " "; cout << "\n";
//}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...