Submission #1228078

#TimeUsernameProblemLanguageResultExecution timeMemory
1228078PVM_pvmMessage (IOI24_message)C++20
100 / 100
399 ms852 KiB
#include "message.h"
#include<bits/stdc++.h>
using namespace std;

void send_message(vector<bool> M, vector<bool> C) {
    vector<vector<bool>> msg(66);
    for (int q=0;q<66;q++) msg[q].resize(31);
    int sl[31];
    int lst=0;
    for (int q=0;q<31;q++)
    {
        if (!C[q])
        {
            lst=q+31;
            break;
        }
    }
    //for (int q=0;q<31;q++) cout<<q<<" "<<C[q]<<"\n";
    for (int q=30;q>=0;q--)
    {
        if (!C[q])
        {
            sl[q]=lst-q;
            lst=q;
            //cout<<q<<" "<<sl[q]<<"\n";
        }
    }
    for (int q=0;q<31;q++)
    {
        if (C[q]) continue;
        for (int w=0;w<(sl[q]-2);w++) msg[w][q]=0;
        msg[ sl[q]-1 ][q]=1;
    }
    reverse(M.begin(),M.end());
    M.push_back(1);
    while (M.size()<1025) M.push_back(0);
    reverse(M.begin(),M.end());
    int cur=0;
    for (int q=0;q<66;q++)
    {
        for (int w=0;w<31;w++)
        {
            if (C[w]) continue;
            if (q<sl[w]) continue;
            msg[q][w]=M[cur];
            cur++;
        }
        send_packet(msg[q]);
    }
}

vector<bool> receive_message(vector<vector<bool>> R) {
    vector<bool> otg;
    int sl[31];
    for (int q=0;q<31;q++) sl[q]=q;
    for (int q=0;q<31;q++)
    {
        for (int w=0;w<66;w++)
        {
            if (R[w][q]==1)
            {
                sl[q]=(q+w+1)%31;
                break;
            }
        }
    }
    bool b[31];
    vector<int> cic;
    for (int q=0;q<31;q++)
    {
        for (int w=0;w<31;w++) b[w]=0;
        cic.clear();
        int cur=q;
        while (true)
        {
            b[cur]=1;
            cic.push_back(cur);
            if (b[ sl[cur] ])
            {
                if (sl[cur]==q)
                {
                    break;
                }
                else
                {
                    cic.clear();
                    break;
                }
            }
            cur=sl[cur];
        }
        if (cic.size()==16)
        {
            break;
        }
    }
    bool rzk[31];
    for (int q=0;q<31;q++) rzk[q]=0;
    for (int q=0;q<cic.size();q++) rzk[ cic[q] ]=1;
    for (int q=0;q<31;q++)
    {
        sl[q]=(sl[q]+31-q)%31;
    }
    bool dl=false;
    for (int q=0;q<66;q++)
    {
        for (int w=0;w<31;w++)
        {
            if (!rzk[w]) continue;
            if (q<sl[w]) continue;

            if (!dl)
            {
                if (R[q][w]==1) dl=true;
            }
            else
            {
                otg.push_back(R[q][w]);
            }
        }
    }
    return otg;
}

#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...