Submission #1286926

#TimeUsernameProblemLanguageResultExecution timeMemory
1286926MMihalev메시지 (IOI24_message)C++20
29.32 / 100
563 ms824 KiB
#include<iostream>
#include<vector>
#include<algorithm>
#include "message.h"
using namespace std;

void send_message(std::vector<bool> M, std::vector<bool> C)
{
    vector<bool>packet1,packet0;
    vector<int>free;

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

    for(int i=0;i<31;i++)
    {
        int bit=C[i];
        if(bit==1)send_packet(packet1);
        else {free.push_back(i);send_packet(packet0);}
    }

    int sz=M.size();
    vector<bool>packetsz;
    packetsz.resize(31);
    for(int i=0;i<16;i++)
    {
        int bit=0;
        if(((1<<i)&(sz))!=0)
        {
            bit=1;
        }
        packetsz[free[i]]=bit;
    }
    send_packet(packetsz);

    for(int i=0;i<M.size();i+=16)
    {
        vector<bool>packet;
        packet.resize(31);
        for(int j=i;j<min((int)M.size(),i+16);j++)
        {
            packet[free[j-i]]=M[j];
        }
        send_packet(packet);
    }
}

std::vector<bool> receive_message(std::vector<std::vector<bool>> R)
{
    vector<bool>ans;
    vector<int>free;

    for(int i=0;i<31;i++)
    {
        auto packet=R[i];

        int cnt0=0,cnt1=0;
        for(int j=0;j<31;j++)
        {
            if(packet[j]==0)cnt0++;
            else cnt1++;
        }
        if(cnt0>cnt1)free.push_back(i);
    }

    int sz=0;

    for(int i=0;i<16;i++)
    {
        if(R[31][free[i]])sz+=(1<<i);
    }

    for(int i=32;i<R.size();i++)
    {
        auto packet=R[i];

        for(int j=0;j<16;j++)
        {
            if(ans.size()<sz)ans.push_back(packet[free[j]]);
        }
    }

    return ans;
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...