Submission #1186073

#TimeUsernameProblemLanguageResultExecution timeMemory
1186073gyg메시지 (IOI24_message)C++20
37.74 / 100
415 ms904 KiB
#include "message.h"
#include <bits/stdc++.h>
using namespace std;
#define arr array 
#define vec vector

bool bt(int x, int i) { return x & (1 << i); }
int wt(int i) { return (1 << i); }

void send_message(vec<bool> _vl, vec<bool> _hr) {
    int sz;
    vec<int> vl;
    arr<int, 16> my{};
    vec<arr<int, 31>> sn;

    sz = _vl.size();
    for (int i = 0; i <= sz - 1; i++) vl.push_back(_vl[i]);
    int nx = 0;
    for (int i = 0; i <= 30; i++)
        if (!_hr[i]) my[nx++] = i;
    sn.resize(70 + my[0]);
    
    nx = 0;
    for (int i = 0; i <= 15; i++) {
        if (i == 0) {
            for (int j = 0; j <= 10; j++) sn[j][my[i]] = bt(sz, j);
            for (int j = 11; j <= 15; j++) sn[j][my[i]] = bt(my[i + 1], j - 11);
            for (int j = 16; j <= 69; j++) {
                if (nx == sz) continue;
                sn[j][my[i]] = vl[nx++]; 
            }
        } else if (i == 15) {
            for (int j = 0; j <= 69; j++) {
                if (nx == sz) continue;
                sn[j][my[i]] = vl[nx++]; 
            }
        } else {
            for (int j = 0; j <= 4; j++) sn[j][my[i]] = bt(my[i + 1], j);
            for (int j = 5; j <= 69; j++) {
                if (nx == sz) continue;
                sn[j][my[i]] = vl[nx++]; 
            }
        }
    }
    assert(nx == sz);

    for (int i = 0; i <= sn.size() - 1; i++) {
        vec<bool> x;
        for (int j = 0; j <= 30; j++) x.push_back(sn[i][j]);
        send_packet(x);
    }
}

vec<bool> receive_message(vec<vec<bool>> _sn) {
    int sz;
    vec<int> vl;
    arr<int, 16> my{};
    vec<arr<int, 31>> sn;

    sn.resize(_sn.size());
    for (int i = 0; i <= sn.size() - 1; i++)
        for (int j = 0; j <= 30; j++)
            sn[i][j] = _sn[i][j];

    my[0] = sn.size() - 70;
    for (int i = 0; i <= 15; i++) {
        if (i == 0) {
            for (int j = 0; j <= 10; j++) 
                if (sn[j][my[i]]) sz += wt(j);
            for (int j = 11; j <= 15; j++) 
                if (sn[j][my[i]]) my[i + 1] += wt(j - 11);
            for (int j = 16; j <= 69; j++) {
                if (vl.size() == sz) continue;
                vl.push_back(sn[j][my[i]]); 
            }
        } else if (i == 15) {
            for (int j = 0; j <= 69; j++) {
                if (vl.size() == sz) continue;
                vl.push_back(sn[j][my[i]]); 
            }
        } else {
            for (int j = 0; j <= 4; j++) 
                if (sn[j][my[i]]) my[i + 1] += wt(j);
            for (int j = 5; j <= 69; j++) {
                if (vl.size() == sz) continue;
                vl.push_back(sn[j][my[i]]); 
            }
        }
    }
    assert(vl.size() == sz);
    
    vec<bool> ans;
    for (int i = 0; i <= sz - 1; i++) ans.push_back(vl[i]);
    return ans;
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...