Submission #1364544

#TimeUsernameProblemLanguageResultExecution timeMemory
1364544eradaxMessage (IOI24_message)C++20
0 / 100
49 ms764 KiB
#include "message.h"
#include<bits/stdc++.h>
using namespace std;
using vb=vector<bool>;

void dbg(vector<int> a){
    cerr<<"vb a =";
    for(int i:a)cerr<<' '<<i;
    cerr<<endl;
}
void dbg(vb a){
    cerr<<"vb a =";
    for(int i:a)cerr<<' '<<i;
    cerr<<endl;
}

void send_message(vb M, vb C){
    int n=ssize(M),m=ssize(C);

    vector<int> c2;
    {
        int p=-1;
        int cnt=0;
        while(cnt<15) {
            vb o(m);

            if(ssize(c2)==0){
                p++;
                o.assign(m,C[p]);
                if(C[p])cnt++;
                if(!C[p])c2.push_back(p);
            } else {
                for(int i=0;i<ssize(c2)&&cnt<15;i++){
                    p++;
                    o[c2[i]]=C[p];
                    if(C[p])cnt++;
                    if(!C[p])c2.push_back(p);
                }
            }

            send_packet(o);
        }
    }

    for(int i=0;i*16<=n;i++){
        vb o(m);
        for(int j=0;j<16;j++)if(i*16+j<n)o[c2[j]]=M[i*16+j];
        send_packet(o);
    }

    vb o(m);
    for(int i=0;i<16;i++)o[c2[i]]=(n>>i)&1;
    send_packet(o);
}

vb receive_message(vector<vb> R){
    int n=0,m=ssize(R[0]);
    vector<int> c2;
    int ri=0;
    {
        int p=-1;
        int cnt=0;
        while(cnt<15) {
            vb o=R[ri++];

            if(ssize(c2)==0){
                p++;
                int s=accumulate(begin(o),end(o),0);
                if(s>=16)cnt++;
                else c2.push_back(p);
            } else {
                for(int i=0;i<ssize(c2)&&cnt<15;i++){
                    p++;
                    if(o[c2[i]])cnt++;
                    else c2.push_back(p);
                }
            }
        }
    }

    // dbg(c2);
    assert(ssize(c2)==16);

    vb o;
    for(int i=ri;i<ssize(R)-1;i++){
        for(int j:c2)o.push_back(R[i][j]);
    }

    cerr<<"ssize(o)="<<ssize(o)<<'\n';
    for(int i=15;~i;i--)(n*=2)+=R.back()[c2[i]];
    o.resize(n);
    return o;
}
#Result Execution timeMemoryGrader output
Fetching results...
#Result Execution timeMemoryGrader output
Fetching results...
#Result Execution timeMemoryGrader output
Fetching results...