제출 #1210434

#제출 시각아이디문제언어결과실행 시간메모리
1210434PagodePaiva메시지 (IOI24_message)C++20
0 / 100
98 ms904 KiB
#include "message.h"
#include<bits/stdc++.h>

using namespace std;

vector <int> construct(vector <int> bons, vector <int> ruins){
    ////cout << bons.size() << ' ' << ruins.size() << '\n';
    //exit(0);
    if(bons.size() == 1 and ruins.size() == 0){
        return bons;
    }
    int n = bons.size();
    vector <bool> A(31, 0);
    for(int i = 0;i < n/2;i++){
        A[bons[i]] = 1;
    }
    vector <bool> pacote = send_packet(A);
    vector <int> bons0, bons1;
    vector <int> ruins0, ruins1;
    for(auto x : bons){
        if(pacote[x] == 0)
            bons0.push_back(x);
        else
            bons1.push_back(x);
    }
    for(auto x : ruins){
        if(pacote[x] == 0)
            ruins0.push_back(x);
        else
            ruins1.push_back(x);
    }
    vector <int> pos;
    if(bons0.size() + ruins0.size() > bons1.size() + ruins1.size()){
        swap(bons0, bons1);
        swap(ruins0, ruins1);
    }
    pos = construct(bons0, ruins0);
    vector <pair<int, int>> posicoes;
    for(auto x : bons1)
        posicoes.push_back({x, 0});
    for(auto x : ruins1)
        posicoes.push_back({x, 1});
    sort(posicoes.begin(), posicoes.end());
    for(int i = 0;i < 31;i++){
        A[i] = 0;
    }
    int len = pos.size(), contador = 0;
    for(int i = 0;i < posicoes.size();i++){
        A[pos[contador]] = posicoes[i].second;
        contador++;
        if(contador == len){
            send_packet(A);
            for(int i = 0;i < 31;i++){
                A[i] = 0;
            }
            contador = 0;
        }
    }
    if(contador != 0){
        send_packet(A);
    }
    return bons;
}

void send_message(std::vector<bool> M, std::vector<bool> C) {
    vector <int> bons, ruins;
    for(int i = 0;i < C.size();i++){
        ////cout << C[i] << ' ';
        if(C[i])
            ruins.push_back(i);
        else
            bons.push_back(i);
    }  
    vector <int> pos = construct(bons, ruins);
    int n = M.size();
    vector <bool> A(31, 0);
    for(int bit = 0;bit < 16;bit++){
        if(((1<<bit)&n)){
            A[pos[bit]] = 1;
        }
    }
    send_packet(A);
    for(int i = 0;i < 31;i++)
        A[i] = 0;
    int contador = 0, len = pos.size();
    for(auto x : M){
        A[pos[contador]] = x;
        contador++;
        if(contador == len){
            send_packet(A);
            contador = 0;
            for(int i = 0;i < 31;i++)
                A[i] = 0;
        }
    }
    if(contador != 0){
        send_packet(A);
    }
    return;
}

vector <vector<bool>> pacotes;

vector <int> resposta(vector <int> mist, int &con){
    if(mist.size() == 1){
        return mist;
    }
    vector <bool> pacote = pacotes[con];
    //cout << 'A' << ' ';
    for(auto x : pacote){
        //cout << x << ' ';
    }
    //cout << '\n';
    con++;
    vector <int> zeros, uns;
    for(auto x : mist){
        if(pacote[x] == 0)
            zeros.push_back(x);
        else
            uns.push_back(x);
    }
    if(zeros.size() > uns.size())
        swap(zeros, uns);
    vector <int> pos = resposta(zeros, con);
    int contador = 0;
    pacote = pacotes[con];
    //cout << 'B' << ' ';
    for(auto x : pacote){
        //cout << x << ' ';
    }
    //cout << '\n';
    con++;
    vector <int> bons, ruins;
    int len = pos.size();
    for(int i = 0;i < uns.size();i++){
        if(pacote[pos[contador]] == 0){
            bons.push_back(uns[i]);
        }
        else{
            ruins.push_back(uns[i]);
        }
        contador++;
        if(contador == len){
            //cout << "B" << ' ';
            pacote = pacotes[con];
            for(auto x : pacote){
                //cout << x << ' ';
            }
            //cout << '\n';
            con++;
            contador = 0;
        }
    }
    if(contador == 0)
        con--;
    for(auto x : bons){
        pos.push_back(x);
    }
    sort(pos.begin(), pos.end());
    return pos;
}   

std::vector<bool> receive_message(std::vector<std::vector<bool>> R) {
    pacotes = R;
    vector <int> mist;
    for(int i = 0;i < 31;i++){
        mist.push_back(i);
    }
    int con = 0;
    vector <int> bons = resposta(mist, con);
    //cout << con << '\n';
    int n = 0;
    vector <bool> pacote = pacotes[con];
    con++;
    for(int i = 0;i < 16;i++){
        if(pacote[bons[i]]){
            n |= (1<<i);
        }
    }
    pacote = pacotes[con];
    con++;
    int contador = 0;
    vector <bool> mensagem;
    for(int i = 0;i < n;i++){
        mensagem.push_back(pacote[bons[contador]]);
        contador++;
        if(contador == bons.size()){
            pacote = pacotes[con];
            con++;
            contador = 0;
        }
    }
    return mensagem;
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...