Submission #1348789

#TimeUsernameProblemLanguageResultExecution timeMemory
1348789pandaa73메시지 (IOI24_message)C++20
87.16 / 100
282 ms852 KiB
#include <bits/stdc++.h>
#include <numeric>
using namespace std;

#define ff endl
#define lf "\n"
#define fi first
#define se second
#define _ << ' ' <<
#define all(x) begin(x),end(x)
#define rall(x) rbegin(x),rend(x)

#ifdef DEBUG

constexpr bool IS_DEBUG = 1;

#define infor(fmt, ...) do { print(stderr, fmt, ##__VA_ARGS__); } while(0)
#define infof(fmt, ...) do { println(stderr, fmt, ##__VA_ARGS__); } while(0)

#else

constexpr bool IS_DEBUG = 0;

#define infor(fmt, ...)
#define infof(fmt, ...)

#endif

using ll = long long;

using pll = pair<ll, ll>;
using pii = pair<int, int>;

template<typename... Args>
using vec = vector<Args...>;

constexpr int LOG = 4;
constexpr int MOD = 1e9+7;
constexpr int MAXN = 1e5+7;

mt19937 timmy_loves_gambling(73);

vector<bool> send_packet(vector<bool> A);

constexpr int N = 31;
constexpr int SZ = 16;

void send_message(vector<bool> M, vector<bool> C) {
    vec<int> P(N);
    for(int i = 0; i < N; ++i) {
        if(C[i]) continue;

        for(int j = i + 1; j != i; ++j) {
            if(j == N) j -= N;

            if(C[j]) {
                P[i] += 1;
            } else break;
        }
    }

    vec<bool> p(N);
    for(int lg = 0; lg < LOG; ++lg) {
        for(int i = 0; i < N; ++i) {
            p[i] = P[i]&1;
            P[i] >>= 1;
        }

        (void)send_packet(p);
    }

    for(int i = 0; i < M.size();) {
        for(int j = 0; j < N; ++j) {
            if(C[j]) continue;

            p[j] = M[i++];
        }

        (void)send_packet(p);
    }

    int len = M.size();

    int j = 0;
    for(int i = N - 1; i >= 0; i--) {
        if(C[i]) continue;

        p[i] = len&1;
        len >>= 1;
    }

    (void)send_packet(p);
}

vector<bool> receive_message(vector<vector<bool>> R) {
    vec<int> P(N);
    for(int lg = LOG - 1; lg >= 0; lg--) {
        for(int i = 0; i < N; ++i) {
            P[i] <<= 1;
            P[i] += R[lg][i];
        }
    }

    vec<bool> C(N);
    for(int i = 0; i < N; ++i) {
        vec<bool> vis(N);

        for(int j = i; vis[j] == 0; j = (j + P[j] + 1) % N) vis[j] = 1;

        C[i] = accumulate(all(vis), 0) != SZ;
    }

    vec<bool> S; S.reserve(SZ * (R.size() - LOG - 1));
    for(int i = LOG; i < R.size() - 1; ++i) {
        for(int j = 0; j < N; ++j) {
            if(C[j]) continue;

            S.emplace_back(R[i][j]);
        }
    }

    int len = 0;
    for(int i = 0; i < N; ++i) {
        if(C[i]) continue;

        len <<= 1;
        len += R.back()[i];
    }

    S.resize(len);

    return S;
}

#ifdef LOCAL
namespace {
const int PACKET_SIZE = 31;
const int CALLS_CNT_LIMIT = 100;

int calls_cnt;
std::vector<bool> C(PACKET_SIZE);
std::vector<std::vector<bool>> R;

void quit(const char* message) {
  printf("%s\n", message);
  exit(0);
}

void run_scenario() {
  R.clear();
  calls_cnt = 0;

  int S;
  assert(1 == scanf("%d", &S));
  std::vector<bool> M(S);
  for (int i = 0; i < S; i++) {
    int bit;
    assert(1 == scanf("%d", &bit));
    assert((bit == 0) || (bit == 1));
    M[i] = bit;
  }

  for (int i = 0; i < PACKET_SIZE; i++) {
    int bit;
    assert(1 == scanf("%d", &bit));
    assert((bit == 0) || (bit == 1));
    C[i] = bit;
  }

  send_message(M, C);
  std::vector<bool> D = receive_message(R);

  int K = (int)R.size();
  int L = (int)D.size();
  printf("%d %d\n", K, L);
  for (int i = 0; i < L; i++)
    printf("%s%d", (i == 0 ? "" : " "), (D[i] ? 1 : 0));
  printf("\n");
}

std::vector<bool> taint(const std::vector<bool>& A) {
  std::vector<bool> B = A;
  bool bit = 0;
  for (int i = 0; i < PACKET_SIZE; i++)
    if (C[i] == 1) {
      B[i] = bit;
      bit = !bit;
    }
  return B;
}

} // namespace

std::vector<bool> send_packet(std::vector<bool> A) {
  calls_cnt++;
  if (calls_cnt > CALLS_CNT_LIMIT)
    quit("Too many calls");
  if ((int)A.size() != PACKET_SIZE)
    quit("Invalid argument");

  std::vector<bool> B = taint(A);
  R.push_back(B);
  return B;
}

int main() {
  int T;
  assert(1 == scanf("%d", &T));
  for (int i = 1; i <= T; i++)
    run_scenario();
}
#endif
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...