Submission #1157083

#TimeUsernameProblemLanguageResultExecution timeMemory
1157083ereringMessage (IOI24_message)C++20
0 / 100
62 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[16];
  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[16];
  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[i].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[i]=='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[16];
    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());
    vector<bool> nd;
    vector<int> willknow;
    int l=4,crnt=0;
    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][crnt])x++;
            cnt2++; crnt++;
            if(crnt==known.size()){
                l++;
                crnt=0;
            }
        }
        known.pb(am[unknown[i].second][x]);
        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...