Submission #1243575

#TimeUsernameProblemLanguageResultExecution timeMemory
1243575alexander707070Message (IOI24_message)C++20
0 / 100
1 ms748 KiB
#include<bits/stdc++.h>
#include "message.h"

using namespace std;

namespace Alice{
    vector<int> good;

    void send(int x){
        vector<bool> mes;

        for(int i=0;i<31;i++){
            mes.push_back(x%2); x/=2;
        }

        send_packet(mes);
    }
};

void send_message(vector<bool> M, vector<bool> C){
    using namespace Alice;
    good.clear();

    int maskgood=0;
    for(int i=0;i<31;i++){
        if(!C[i]){
            good.push_back(i);
            maskgood^=(1<<i);
        }
    }

    for(int i=0;i<5;i++){
        if(good[0]&(1<<i))send(maskgood);
        else send(0);
    }

    vector<bool> mess(1026-int(M.size())-1,0);
    mess.push_back(1);

    for(auto b:M)mess.push_back(b);

    int pt=0,to=0;
    for(int i=0;i<30;i++){
        vector<bool> curr(31,0);

        if(pt==good[0])pt++;
        curr[good[0]]=!C[pt];

        for(int f=1;f<16;f++){
            curr[good[f]]=mess[to];
            to++;
        }

        send_packet(curr);
        pt++;
    }

    for(int i=0;i<36;i++){
        vector<bool> curr(31,0);
        
        for(int f=0;f<16;f++){
            curr[good[f]]=mess[to];
            to++;
        }

        send_packet(curr);
    }

    assert(to==1026);
    assert(pt==32);
}

namespace Bob{
    vector<int> good;
};

vector<bool> receive_message(vector< vector<bool> > R){
    using namespace Bob;
    good.clear();

    int pos=0;
    for(int i=0;i<5;i++){
        int bal=0;

        for(int f=0;f<31;f++){
            if(R[i][f])bal++;
            else bal--;
        }

        if(bal>0)pos^=(1<<i);
    }

    good.push_back(pos);

    int pt=0;
    for(int i=0;i<30;i++){
        if(pt==pos)pt++;

        if(R[5+i][pos])good.push_back(i);
        pt++;
    }

    vector<bool> mess;
    for(int i=0;i<30;i++){
        for(int f=1;f<16;f++){
            mess.push_back(R[5+i][good[f]]);
        }
    }

    for(int i=0;i<36;i++){
        for(int f=0;f<16;f++){
            mess.push_back(R[5+i][good[f]]);
        }
    }

    vector<bool> ans;
    bool ok=false;
    for(int i=0;i<mess.size();i++){
        if(ok)ans.push_back(mess[i]);
        if(mess[i])ok=true;
    }

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