Submission #1217461

#TimeUsernameProblemLanguageResultExecution timeMemory
1217461dostsMessage (IOI24_message)C++20
0 / 100
0 ms848 KiB
#include "message.h"
#include <bits/stdc++.h>
#pragma GCC optimize("O3,unroll-loops")
#pragma GCC target("avx2")
//#define int long long
#define pii pair<int,int>
#define vi vector<int>
#define ff first
#define ss second
#define sp << " " <<
#define all(x) x.begin(),x.end()
#define big(x) ((int)(x.size()))
using namespace std;
void send_message(std::vector<bool> M, std::vector<bool> C) {
  std::vector<bool> A(31, 0);
  vi clean;
  for (int i = 0;i<18;i++) {
    for (int j = 0;j<31;j++) A[j] = C[i];
    if (!C[i]) clean.push_back(i);
    send_packet(A);
  }
  A.assign(31,0);
  if (clean.size() > 3) {
    int nxt = 18;
    //tüm shitler bulunmadıysa
    for (int j = 0;nxt<31;j++) {
      for (int i = 0;i<4 && nxt < 31;i++) {
        A[clean[i]] = C[nxt++];
      }
      send_packet(A);
    }
  }
  
  int  S = big(M);
  vector<bool> szpack(31,0);
  for (int i = 0;i<11;i++) {
    szpack[clean[i]] = !!(S&(1<<i));
  }
  send_packet(szpack);
  int j = 0;
  for (int i = 0;i<(S+15)/16;i++) {
    int ptr = 0;
    for(int t = 0;t<16;t++) {
      A[clean[ptr++]] = M[j++];
    }
    send_packet(A);
  }
}

std::vector<bool> receive_message(std::vector<std::vector<bool>> R) {
/*   int rsz = R.size();
  for (int i = 0;i<rsz;i++) {
    for (int j = 0;j<31;j++) cerr << R[i][j];
    cerr << '\n';
  } */
  vi clean;
  for (int i = 0;i<18;i++) {
    int z = 0,o = 0;
    for (auto it : R[i]) {
      if (it) o++;
      else z++;
    }
    if (z > o) clean.push_back(i);
  }
  int curr = 18;
  if (big(clean) > 3) {
    int nxt = 18;
    for (int j = 0;nxt<31;j++) {
      for (int k = 0;k<4 && nxt < 31;k++) {
        if (!R[curr][clean[k]]) clean.push_back(nxt);
        nxt++;
      }
      curr++;
    }
  }
  else for (int j = 18;j<31;j++) clean.push_back(j);
  int s = 0;
  for (int i = 0;i<11;i++) {
    if (R[curr][clean[i]]) s+=(1<<i);
  }
  curr++;
  //cerr << s sp curr << endl;
  vector<bool> M(s);
  int j = 0;
  for (int i = 0;i<(s+15)/16;i++) {
    int ptr = 0;
    for (int t = 0;t<16;t++) {
      M[j++] = R[curr][clean[ptr++]];
    }
    curr++;
  }
  return M;
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...