Submission #1254073

#TimeUsernameProblemLanguageResultExecution timeMemory
1254073erdemkirazMessage (IOI24_message)C++20
100 / 100
381 ms848 KiB
#include "message.h"
#include <bits/stdc++.h>

using namespace std;

typedef long long ll;
typedef pair<int, int> ii;

void send_message(vector<bool> M, vector<bool> C) {
  M.push_back(1);
  while((int) M.size() < 1025) {
    M.push_back(0);
  }

  assert((int) M.size() == 1025);

  vector<int> v;
  vector<int> w(31, -1);
  for(int i = 0; i < 31; i++) {
    if(!C[i]) {
      w[i] = (int) v.size();
      v.push_back(i);
    }
  }
  vector<int> d;
  for(int i = 0; i < 15; i++) {
    d.push_back(v[i + 1] - v[i]);
  }
  d.push_back(31 + v[0] - v[15]);

  int it = 0;
  for(int i = 0; i < 66; i++) {
    vector<bool> A(31, 0);
    for(int j = 0; j < 31; j++) {
      if(C[j] == 0) {
        if(d[w[j]] > 0) {
          // printf("i = %d j = %d\n", i, j);
          A[j] = !--d[w[j]];
        }
        else {
          A[j] = M[it++];
        }
      }
    }
    send_packet(A);
  }
  assert(it == (int) M.size());
}

vector<bool> receive_message(vector<vector<bool>> R) {

  vector<int> go(31, -1);

  for(int i = 0; i < 31; i++) {
    int st = -1;
    for(int j = 0; j < 16; j++) {
      if(R[j][i]) {
        st = j;
        break;
      }
    }
    // printf("i = %d st = %d\n", i, st);
    if(st != -1) {
      go[i] = (i + st + 1) % 31;
    }
  }

  vector<int> goods;

  for(int i = 0; i < 31; i++) {
    int x = i;
    for(int it = 0; it < 31 and x != -1; it++) {
      x = go[x];
    }
    if(x == -1) {
      continue;
    }
    int y = x;
    bool fail = false;
    for(int it = 0; it < 15; it++) {
      y = go[y];
      if(y == x) {
        fail = true;
        break;
      }
    }
    if(!fail) {
      for(int i = 0; i < 16; i++) {
        goods.push_back(x);
        x = go[x];
      }
      break;
    }
  }

  // printf("sz = %d\n", (int) goods.size());

  assert((int) goods.size() == 16);

  sort(goods.begin(), goods.end());

  vector<int> w(31, -1);
  for(int i = 0; i < (int) goods.size(); i++) {
    w[goods[i]] = i;
  }
  vector<int> d;
  for(int i = 0; i < 15; i++) {
    d.push_back(goods[i + 1] - goods[i]);
  }
  d.push_back(31 + goods[0] - goods[15]);

  vector<bool> C(31, 1);
  for(auto x : goods) {
    C[x] = 0;
  }

  vector<bool> M;

  for(int i = 0; i < 66; i++) {
    for(int j = 0; j < 31; j++) {
      if(C[j] == 0) {
        if(d[w[j]] > 0) {
          d[w[j]]--;
        }
        else {
          M.push_back(R[i][j]);
        }
      }
    }
  }

  while(M.back() == 0) {
    M.pop_back();
  }
  M.pop_back();

  return M;
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...