Submission #1297854

#TimeUsernameProblemLanguageResultExecution timeMemory
1297854gesp3011v2Message (IOI24_message)C++20
29.32 / 100
567 ms836 KiB
#include "message.h"
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef long double ld;
#define F(i,l,r) for(int i=l,i_end=r;i<i_end;++i)
#define FR(i,l,r) for(int i=l,i_end=r;i>=i_end;--i)

void send_message(vector<bool> message, vector<bool> positions) {
    F(i,0,31){
        vector<bool> bits(31);
        for (int j=0; j<31; j++) bits[j] = positions[i];
        send_packet(bits);
    }
    vector<int> needed,mine;
    F(i,0,31)if(positions[i]==0)mine.push_back(i);
    int sz=(message.size()+4);
    int rem=16-(sz%16);
    rem%=16;
    F(i,0,4){
        needed.push_back(rem%2);
        rem>>=1;
    }
    F(i,0,message.size())needed.push_back(message[i]);
    rem=16-(sz%16);
    rem%=16;
    F(i,0,rem)needed.push_back(0);
    F(round,0,needed.size()/16){
        vector<bool> bits(31);
        F(j,0,16)bits[mine[j]]=needed[round*16+j];
        send_packet(bits);
    }
}

vector<bool> receive_message(vector<vector<bool>> received_bits) {
    vector<bool> message;
    vector<int> mine;
    for(int i=0;i<31;i++){
        sort(received_bits[i].begin(), received_bits[i].end());
        if(received_bits[i][15]==0) mine.push_back(i);
    }
    vector<bool> received;
    F(i,31,received_bits.size()){
        for(auto j:mine)received.push_back(received_bits[i][j]);
    }
    int rem=0;
    FR(i,3,0){
        rem<<=1; 
        rem+=received[i];
    }
    for(int i=4;i<received.size()-rem;i++)message.push_back(received[i]);
    return message;
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...