Submission #1157175

#TimeUsernameProblemLanguageResultExecution timeMemory
1157175ereringMessage (IOI24_message)C++20
0 / 100
63 ms840 KiB
#include <bits/stdc++.h>
using namespace std;
#define endl '\n'
#define pb push_back
#include "message.h"

void send_message(vector<bool> M, vector<bool> C) {
    vector<vector<bool>> A(4,vector<bool>(31));
    int x=0,pos[17];
    vector<int> gd;
    for(int i=0;i<31;i++){
        if(!C[i]){
            int rep=x;
            for(int j=0;j<4;j++){
                A[j][i]=rep%2;
                rep/=2;
            }
            pos[x]=i;
            gd.pb(i);
            x++;
        }
        else{
            for(int j=0;j<4;j++)A[j][i]=0;
        }
    }
    vector<bool> edited[4];
    for(int i=0;i<4;i++){
        edited[i]=send_packet(A[i]);
    }
    vector<int> am[17];
    for(int i=0;i<31;i++){
        x=0;
        for(int j=3;j>=0;j--){
            x*=2;
            if(edited[j][i])x++;
        }
        am[x].pb(i);
    }
    vector<int> known;
    vector<pair<int,int>>  unknown;
    vector<vector<bool>> vec;
    for(int i=0;i<16;i++){
        if(am[i].size()==1)known.pb(am[i][0]);
        else unknown.pb({am[i].size(),i});
    }
    sort(known.begin(),known.end());
    sort(unknown.begin(),unknown.end());
    vector<bool> nd;
    vector<int> willknow;
    for(int i=0;i<unknown.size();i++){
        int cnt=0;
        x=1;
        while(x<unknown[i].first){
            x*=2;
            cnt++;
        }
        int req=pos[unknown[i].second];
        for(int j=0;j<am[unknown[i].second].size();j++){
            if(am[unknown[i].second][j]==pos[unknown[i].second]){
                req=j;
                break;
            }
        }
        string s;
        for(int j=0;j<cnt;j++){
            if(req%2)s+='1';
            else s+='0';
            req/=2;
            if(j==cnt-1)willknow.pb(pos[unknown[i].second]);
            else willknow.pb(-1);
        }
        reverse(s.begin(),s.end());
        for(int j=0;j<s.size();j++)nd.pb(s[j]=='1');
    }
    int l=0;
    vector<bool> message(31,0);
    vector<int> ready;
    for(int i=0;i<nd.size();i++){
        message[known[l]]=nd[i];
        if(willknow[i]!=-1)ready.pb(willknow[i]);
        l++;
        if(l==known.size() || i==nd.size()-1){
            send_packet(message);
            l=0;
            for(int j=0;j<ready.size();j++)known.pb(ready[j]);
            ready.clear();
            sort(known.begin(),known.end());
        }
    }
    l=0;
    for(int i=0;i<M.size();i++){
        message[known[l]]=M[i];
        l++;
        if(l==known.size() || i==M.size()-1){
            l=0;
            send_packet(message);
        }
    }
    int sz=M.size();
    for(int i=0;i<message.size();i++)message[i]=0;
    for(int i=known.size()-1;i>=0;i--){
        if(sz%2)message[known[i]]=1;
        sz/=2;
    }
    send_packet(message);
}

vector<bool> receive_message(vector<vector<bool>> R) {
    int x;
    vector<int> am[17];
    for(int i=0;i<31;i++){
        x=0;
        for(int j=3;j>=0;j--){
            x*=2;
            if(R[j][i])x++;
        }
        am[x].pb(i);
    }
    vector<int> known;
    vector<pair<int,int>>  unknown;
    vector<vector<bool>> vec;
    for(int i=0;i<16;i++){
        if(am[i].size()==1)known.pb(am[i][0]);
        else unknown.pb({am[i].size(),i});
    }
    sort(known.begin(),known.end());
    sort(unknown.begin(),unknown.end());
   // for(auto i:known)cout<<i<<' ';
    cout<<endl;
    vector<bool> nd;
    int l=4,crnt=0,last=known.size();
    for(int i=0;i<unknown.size();i++){
        int cnt=0,cnt2=0;
        x=1;
        while(x<unknown[i].first){
            x*=2;
            cnt++;
        }
        x=0;
        while(cnt2<cnt){
            x*=2;
            if(R[l][known[crnt]])x++;
            cnt2++; crnt++;
            if(crnt==last){
                l++;
                crnt=0;
                last=known.size();
            }
        }
        known.pb(am[unknown[i].second][x]);
        if(crnt==0)last=known.size();
        sort(known.begin(),known.end());
    }
    vector<bool> ans;
    int sz=0;
    for(int i=0;i<known.size();i++){
        sz*=2;
        if(R[R.size()-1][known[i]]){
            sz++;
        }
    }
    if(crnt!=0)l++;
    for(int i=l;i<R.size();i++){
        for(int j=0;j<known.size() && ans.size()<sz;j++)ans.pb(R[i][known[j]]);
    }
    return ans;
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...