Submission #1203907

#TimeUsernameProblemLanguageResultExecution timeMemory
1203907abczzMessage (IOI24_message)C++20
100 / 100
404 ms880 KiB
#include "message.h"
#include <iostream>
#include <vector>
#include <queue>
#define ll long long

using namespace std;

vector <ll> V;
ll S[66][31], cur[31];
void send_message(std::vector<bool> M, std::vector<bool> C) {
  V.clear();
  for (int i=0; i<31; ++i) {
    cur[i] = 0;
    if (C[i] == 0) V.push_back(i);
  }
  for (int i=0; i<V.size(); ++i) {
    for (int j=0; j<(i == V.size()-1 ? V[0]+31 : V[i+1])-V[i]-1; ++j) {
      S[cur[V[i]]++][V[i]] = 0;
    }
    S[cur[V[i]]++][V[i]] = 1;
  }
  for (auto u : M) {
    for (auto v : V) {
      if (cur[v] == 66) continue;
      S[cur[v]++][v] = u;
      break;
    }
  }
  auto z = M.back();
  while (true) {
    bool ok = 0;
    for (auto v : V) {
      if (cur[v] == 66) continue;
      ok = 1;
      S[cur[v]++][v] = z ^ 1;
      break;
    }
    if (!ok) break;
  }
  for (int i=0; i<66; ++i) {
    vector <bool> Q;
    for (int j=0; j<31; ++j) Q.push_back((bool)S[i][j]);
    send_packet(Q);
  }
}

vector <ll> adj[31];
bool visited[31];
void dfs(ll u) {
  visited[u] = 1;
  for (auto v : adj[u]) {
    if (!visited[v]) dfs(v);
  }
}

std::vector<bool> receive_message(std::vector<std::vector<bool>> R) {
  ll cur[31];
  for (int i=0; i<31; ++i) {
    adj[i].clear();
    cur[i] = 0;
    for (int j=0; j<66; ++j) {
      ++cur[i];
      if (R[j][i] == 1) {
        adj[i].push_back((i+j+1) % 31);
        break;
      }
    }
  }
  vector <ll> X;
  for (int i=0; i<31; ++i) {
    for (int j=0; j<31; ++j) visited[j] = 0;
    dfs(i);
    ll f = 0;
    for (int j=0; j<31; ++j) f += (ll)visited[j];
    if (f == 16) X.push_back(i);
  }
  vector <bool> M;
  for (auto u : X) {
    for (int i=cur[u]; i<66; ++i) {
      M.push_back(R[i][u]);
    }
  }
  while (!M.empty()) {
    auto u = M.back();
    M.pop_back();
    if (M.back() != u) break;
  }
  return M;
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...