Submission #1298321

#TimeUsernameProblemLanguageResultExecution timeMemory
1298321tuandqMessage (IOI24_message)C++20
53.89 / 100
469 ms828 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) {
    // SEND C WITH OPTIMIZATIONS
    int ma = 0, pos = -1 ;
    for(int i = 0; i < 31; i ++) if(!C[i]) {
        int j = i ;
        while(j < 30 && !C[j + 1]) ++ j ;
        if(j - i + 1 > ma) {
            ma = j - i + 1 ; pos = i ;
        }
        i = j ;
    }
    
    if(ma == 1) {
        vector<vector<bool>> buck = encode(31, 5) ;
        for(vector<bool> &cur : buck) {
            send_packet(cur) ;
        }
    }
    
    else {
        vector<vector<bool>> buck = encode(pos, 5) ;
        for(vector<bool> &cur : buck) {
            send_packet(cur) ;
        }

        int k = pos - 1, l = pos + 2, key = -1 ;
        if(!pos) k = l, ++ l ;
        else if(pos == 29) l = k, -- k ;

        vector<bool> pack(31, false) ;
        pack[pos] = C[k] ; pack[pos + 1] = C[l] ;
        key = (!C[k] ? k : (!C[l] ? l : -1)) ;
        send_packet(pack) ;

        vector<int> indices ;
        int le = min(pos, k), ri = max(pos + 1, l) ;
        for(int i = 0; i < 31; i ++) {
            if(i >= le && i <= ri) continue ;
            indices.emplace_back(i) ;
            // cerr << i << ' ' ;
        } //assert
        
        for(int i = 2; i < indices.size(); i += 3) {
            int u = indices[i - 2] ;
            int v = indices[i - 1], w = indices[i] ;

            vector<bool> pack(31, false) ;
            pack[pos] = C[u] ; pack[pos + 1] = C[v] ;
            // cerr << "-> " << pos << ' ' << u << ' ' << C[u] << ' ' << pos + 1 << ' ' << v << ' ' << C[v] << endl ;
            
            if(key == -1) {
                for(int r : indices) pack[r] = C[w] ;
            }
            else {
                pack[key] = C[w] ;
            }

            send_packet(pack) ;
        }
    }
    
    // SEND MESSAGE STRAIGHTLY FOWARD
    vector<int> idx ;
    for(int i = 0; i < 31; i ++) {
        if(!C[i]) idx.emplace_back(i) ;
    }

    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()) ;

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

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

        send_packet(pack) ;
    }
}

vector<bool> receive_message(vector<vector<bool>> R) {
    // DECODE THE STRING C    
    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])) ;
    }

    vector<bool> C(31, true) ;
    
    int num = 5 ;
    if(pos == 31) {
        for(int d = 0; d < 31; d += 2) C[d] = false ;
    }
    else {
        num = 15 ;
        C[pos] = C[pos + 1] = false ;

        int k = pos - 1, l = pos + 2, key = -1 ;
        if(!pos) k = l, ++ l ;
        else if(pos == 29) l = k, -- k ;

        vector<int> indices ;
        int le = min(pos, k), ri = max(pos + 1, l) ;
        for(int i = 0; i < 31; i ++) {
            if(i >= le && i <= ri) continue ;
            indices.emplace_back(i) ;
        }
        
        C[k] = R[5][pos] ; C[l] = R[5][pos + 1] ;
        key = (!C[k] ? k : (!C[l] ? l : -1)) ;

        int iter = 2 ;
        for(int i = 6; i < num; i ++, iter += 3) {
            int u = indices[iter - 2] ;
            int v = indices[iter - 1], w = indices[iter] ;

            C[u] = R[i][pos] ; C[v] = R[i][pos + 1] ;
            // cerr << "<- " << pos << ' ' << u << ' ' << R[i][pos] << ' ' << pos + 1 << ' ' << v << ' ' << R[i][pos + 1] << " | " << w << endl ;

            if(key == -1) {
                vector<int> cnt(2, 0) ;
                for(int r : indices) ++ cnt[(int)R[i][r]] ;
                C[w] = (cnt[1] > cnt[0]) ;
            }
            else {
                C[w] = R[i][key] ;
            }
        }
    }
    // cerr << "Finished decoding C\n" ;
    
    // DECODE THE SIZE OF MESSAGE AND ITS BITS

    vector<int> idx ;
    for(int i = 0; i < 31; i ++) {
        if(!C[i]) idx.emplace_back(i) ;
    }
    
    int numSz = 0 ;
    for(int i = 0; i < 10; i ++) {
        numSz = numSz << 1 | ((int)R[num][idx[i]]) ;
    }
    ++ numSz ;
    
    int iter = 9 ;
    vector<bool> res ;
    for(; numSz > 0; numSz --) {
        if(++ iter == 16) iter = 0, ++ 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...