Submission #1166195

#TimeUsernameProblemLanguageResultExecution timeMemory
1166195kimMessage (IOI24_message)C++20
27.43 / 100
551 ms868 KiB
#include "message.h"
#include<bits/stdc++.h>
using namespace std;
#define eb emplace_back
#define sz(x) (int)x.size()

void send_message(std::vector<bool> M, std::vector<bool> C) {
  int S=sz(M);
  
  vector<vector<bool>> vecvec;
  for(int i=0;i!=S;){
    vector<bool> vec(31);
    for(int j=0;j<31 && i!=S;++j) if(!C[j]) vec[j]=M[i++];
    vecvec.eb(vec);
  }

  vector<bool> vecbitS(31);
  for(int i=0,j=0;(1<<i)<=S;++i,++j){
    while(C[j]) ++j;
    vecbitS[j]=((S>>i)&1);
  }

  vector<int> top5;
  vector<vector<bool>> vecCid(15,vector<bool>(31));
  for(int i=0;i<31&&sz(top5)!=5;++i) if(!C[i]) top5.eb(i);
  for(int i=0,k=0;i<31;++i) if(C[i]){
    for(int j=0;j<5;++j) vecCid[k][top5[j]]=((i>>j)&1);
    ++k;
  }


  for(int i=0;i<5;++i) send_packet(vector<bool>(31,(top5[0]>>i)&1));
  for(int i=0;i<5;++i) send_packet(vector<bool>(31,(top5[1]>>i)&1));
  {
    vector<bool> tmp,tmp2(31);
    for(int i=0;i<5;++i) tmp.eb((top5[2]>>i)&1);
    for(int i=0;i<5;++i) tmp.eb((top5[3]>>i)&1);
    for(int i=0;i<5;++i) tmp.eb((top5[4]>>i)&1);
    for(int i=0;i<=14;i+=2){
      tmp2[top5[0]]=tmp[i];
      if(i+1<15) tmp2[top5[1]]=tmp[i+1];
      send_packet(tmp2);
    }
  }
  for(auto &vec:vecCid) send_packet(vec);
  send_packet(vecbitS);
  for(auto &vec:vecvec) send_packet(vec);
}

std::vector<bool> receive_message(std::vector<std::vector<bool>> R) {
  vector<bool> C(31);
  
  vector<int> top5;
  for(int k=0;k<2;++k){
    int id=0;
    for(int i=0;i<5;++i){
      array<int,2> cnt{0,0};
      for(int j=0;j<31;++j) ++cnt[R[5*k+i][j]];
      if(cnt[0]<cnt[1]) id|=(1<<i);
    }
    top5.eb(id);
  }
  vector<bool> tmp;
  for(int k=10;k<=17;++k){
    tmp.eb(R[k][top5[0]]);
    if(k!=17) tmp.eb(R[k][top5[1]]);
  }
  for(int i=0;i<3;++i){
    int id=0;
    for(int j=0;j<5;++j){
      id|=(tmp[5*i+j]<<j);
    }
    top5.eb(id);
  }
  for(int i=18;i<33;++i){
    int id=0;
    for(int j=0;j<5;++j) id|=(R[i][top5[j]]<<j);
    C[id]=1;
  }
  int K=33;

  int S=0;
  for(int i=0,j=0;i<31;++i) if(!C[i]) S|=(R[K][i]<<j), ++j;
  vector<bool> M(S);
  for(int i=K+1,j=0;i<sz(R) && j!=S;++i){
    for(int k=0;k<31 && j!=S;++k){
      if(!C[k]){
        M[j++]=R[i][k];
      }
    }
  }
  return M;
}
/*
2
4
0 1 1 0
0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0
1 1 1 1 1 1 1 1 1 1
1 1 1 1 1

31
0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1
0 1 0 1 0 1 0 1 0 1 0 1 0 1 0
1 1 1 1 1 1 1 1 0 0 0 0 0 0 0 0
0 1 0 1 0 1 0 1 0 1 0 1 0 1 0
*/
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...