Submission #1334905

#TimeUsernameProblemLanguageResultExecution timeMemory
1334905danglayloi1Message (IOI24_message)C++20
76.16 / 100
418 ms836 KiB
// #define dak
#ifndef dak
#include "message.h"
#endif
#include <bits/stdc++.h>
#define ii pair<int, int>
#define fi first
#define se second
using namespace std;
#ifdef dak
void send_packet(vector<bool> s)
{

}
#endif
vector<int> ha={15, 5, 23, 12, 27, 30, 20, 6, 7, 22, 16, 19, 9, 24, 21, 10, 0, 11, 1, 28, 13, 25, 2, 18, 4, 8, 29, 14, 17, 3, 26};
void send_message(vector<bool> M, vector<bool> C)
{
    int len=M.size();
    len--;
    vector<bool> res={}, ve;
    for(int i = 0; i < 10; i++)
        res.emplace_back((len>>i&1));
    for(bool x:M)
        res.emplace_back(x);
    int pos=-1;
    for(int i = 0; i < 31; i++)
    {
        if(C[i]==0)
        {
            pos=i;
            break;
        }
    }
    for(int i = 0; i < 5; i++)
    {
        ve.clear();
        for(int j = 0; j < 31; j++)
        {
            ve.emplace_back((pos>>i&1));
        }
        send_packet(ve);
    }
    int dem=1, poi=0;
    for(int i = 1; i < 31; i++)
    {
        int nxt=(pos+i)%31;
        ve.clear();
        for(int j = 0; j < 31; j++)
        {
            if(j==pos) ve.emplace_back(C[nxt]);
            else if(C[j]==0)
            {
                if(poi==res.size()) ve.emplace_back(0);
                else ve.emplace_back(res[poi++]);
            }
            else ve.emplace_back(0);
        }
        send_packet(ve);
        dem+=(C[nxt]==0);
        if(dem==16) break;
    }
    while(poi<res.size())
    {
        ve.clear();
        for(int j = 0; j < 31; j++)
        {
            if(C[j]==0)
            {
                if(poi==res.size()) ve.emplace_back(0);
                else ve.emplace_back(res[poi++]);
            }
            else ve.emplace_back(0);
        }
        send_packet(ve);
    }
}

vector<bool> receive_message(vector<vector<bool>> R)
{
    vector<bool> ve={}, res={}, C(31, true);
    int pos=0, poi=0;
    for(int j = 0; j < 5; j++)
    {
        ii cnt={0, 0};
        for(int i = 0; i < 31; i++)
            if(R[poi][i]==0) cnt.fi++;
            else cnt.se++;
        poi++;
        if(cnt.fi<cnt.se) pos+=(1<<j);
    }
    C[pos]=0;
    int dem=1;
    int le=poi, ri=poi;
    for(int i = 1; i < 31; i++)
    {
        ri=poi;
        int nxt=(pos+i)%31;
        C[nxt]=R[poi][pos];
        poi++;
        dem+=(C[nxt]==0);
        if(dem==16) break;
    }
    for(int i = le; i <= ri; i++)
    {
        for(int j = 0; j < 31; j++)
        {
            if(j==pos) continue;
            if(C[j]==0) ve.emplace_back(R[i][j]);
        }
    }
    for(int i = poi; i < R.size(); i++)
    {
        for(int j = 0; j < 31; j++)
        {
            if(C[j]==0) ve.emplace_back(R[i][j]);
        }
    }
    for(int i = 10; i < ve.size(); i++)
        res.emplace_back(ve[i]);
    int len=1;
    for(int i = 0; i < 10; i++)
        len+=(1<<i)*ve[i];
    while(res.size()>len) res.pop_back();
    return res;
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...