Submission #1242790

#TimeUsernameProblemLanguageResultExecution timeMemory
1242790erray메시지 (IOI24_message)C++20
100 / 100
410 ms948 KiB
#include <bits/stdc++.h>
#include "message.h"

using namespace std;

#ifdef DEBUG
	#include "debug.h"
#else 
	#define debug(...) void(37)
#endif

constexpr int N = 31, O = 16;
constexpr int Q = 66, M_len = 1025;
vector<array<int, 3>> message_positions(vector<bool> C) {
	vector<int> ones; 
	for (int i = 0; i < N; ++i) {
		if (!C[i]) {
			ones.push_back(i);
		}
	}
	assert(int(ones.size()) == O);
	vector<int> next_dist(O);
	for (int i = 0; i < O; ++i) {
		next_dist[i] = ones[(i + 1) % O] - ones[i];
	}
	next_dist[O - 1] += N;
	vector<array<int, 3>> res;
	int p = 0;
	for (int i = 0; i < O; ++i) {
		for (int j = 0; j < Q; ++j) {
			int put;
			if (j < next_dist[i] - 1) put = -2;
			else if (j == next_dist[i] - 1) put = -1;
			else put = p++;
			res.push_back({j, ones[i], put});
		}
	}
	debug(p);
	return res;
}

void send_message(std::vector<bool> M, std::vector<bool> C) {
	M.push_back(!M.back());
	while (M.size() < M_len) M.push_back(M.back());
	vector<vector<bool>> S(Q, vector<bool>(N));
	for (auto[x, y, t] : message_positions(C)) {
		if (t == -2) S[x][y] = false;
		else if (t == -1) S[x][y] = true;
		else S[x][y] = M[t];
	}
	debug(S);
	for (int i = 0; i < Q; ++i) {
		send_packet(S[i]);
	}
}

std::vector<bool> receive_message(std::vector<std::vector<bool>> R) {
	vector<int> point(N + 1, N);
	for (int i = 0; i < N; ++i) {
		int p = 0;
		debug(i);
		while (p < Q && !R[p][i]) ++p;
		point[i] = (i + p + 1) % N;
	}
	debug(point);
	vector<bool> C;
	for (int i = 0; i < N; ++i) {
		C.assign(N, true);
		int v = i;
		for (int j = 0; j < Q; ++j, v = point[v]) {
			if (v < N) C[v] = false;
		}
		if (accumulate(C.begin(), C.end(), 0) == O - 1) break;
	}
	debug(C);
	vector<bool> M(M_len);
	for (auto[x, y, t] : message_positions(C)) {
		if (t >= 0) {
			M[t] = R[x][y];
		}
	}
	while (M.back() == M.end()[-2]) 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...