Submission #1298462

#TimeUsernameProblemLanguageResultExecution timeMemory
1298462tuandqMessage (IOI24_message)C++20
76.16 / 100
477 ms832 KiB
#include <bits/stdc++.h>
using namespace std ;

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

vector<vector<bool>> encode(int num, const int &d) {
    vector<vector<bool>> res ;
    for(int i = d - 1; i > -1; i --) {
        res.emplace_back(vector<bool>(31, (bool)(num >> i & 1))) ;
    }
    return res ;
}

void send_message(vector<bool> M, vector<bool> C) {
    vector<int> idx ;
    for(int i = 0; i < 31; i ++) {
        if(!C[i]) idx.emplace_back(i) ;
    }
    vector<vector<bool>> buck = encode(idx[0], 5) ;
    for(vector<bool> &cur : buck) send_packet(cur) ;

    int s = (int)M.size() - 1 ;
    reverse(M.begin(), M.end()) ;
    for(int i = 0; i < 10; i ++) {
        M.emplace_back((bool)(s >> i & 1)) ;
    }
    reverse(M.begin(), M.end()) ;

    int cnt = 0 ;
    for(int i = 0; i < M.size() || cnt < 29;) {
        vector<bool> pack(31, false) ;

        int x = min((int)M.size() - i + (cnt < 29), 16) ;
        for(int j = cnt < 29; j < x; j ++) {
            pack[idx[j]] = M[i] ; ++ i ;
        }
        if(cnt < 29) pack[idx[0]] = C[cnt + (cnt >= idx[0])] ;

        // for(bool cur : pack) cerr << i << ' ' << cur << endl ;
        // cerr << endl ;

        send_packet(pack) ; ++ cnt ;
    }
}

vector<bool> receive_message(vector<vector<bool>> R) {
    int pos = 0 ;
    for(int i = 0; i < 5; i ++) {
        vector<int> cnt(2, 0) ;
        for(int j = 0; j < 31; j ++) {
            ++ cnt[(int)R[i][j]] ;
        }
        pos = pos << 1 | ((int)(cnt[1] > cnt[0])) ;
    }
    cerr << "Found " << pos << endl ;

    vector<int> idx ; idx.emplace_back(pos) ;
 
    int cnt = 0, cur = 0 ;
    for(int i = 0; i < 29; i ++, cur ++) {
        if(cur == pos) ++ cur ;
        if(!R[i + 5][pos]) -- cnt, idx.emplace_back(cur) ;
        else ++ cnt ;

        cerr << cur << ' ' << R[i + 5][pos] << endl ;
    }
    if(cnt > 0) idx.emplace_back(cur += (cur == pos)) ;

    // for(int x : idx) cerr << x << ' ' ;
    // cerr << endl ;

    cerr << "Finished decoding C" << endl ;

    int numSz = 0 ;
    for(int i = 1; i < 11; i ++) {
        numSz = numSz << 1 | ((int)R[5][idx[i]]) ;
    }
    ++ numSz ;

    cerr << "Size equals " << numSz << endl ;
    
    vector<bool> res ;
    int iter = 10, num = 5 ; cnt = 0 ;
    for(; numSz > 0; numSz --) {
        if(++ iter == 16) iter = (++ cnt < 29), ++ num ;
        res.emplace_back(R[num][idx[iter]]) ;
    }
    return res ;
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...