Submission #1253811

#TimeUsernameProblemLanguageResultExecution timeMemory
1253811PanosPaskMessage (IOI24_message)C++20
10 / 100
362 ms820 KiB
#include "message.h"
#define pb push_back
#define CHECK_BIT(var, pos) (((var) & (1 << (pos))) != 0)

using namespace std;

const int N = 31;
const int GOOD = 16;

void majority(int b) {
	vector<bool> packet(N);
	for (int i = 0; i < N; i++) {
		packet[i] = b;
	}

	send_packet(packet);
}

int count(vector<bool> packet) {
	int one = 0;
	for (int i = 0; i < N; i++) {
		one += packet[i];
	}
	return one >= GOOD;
}

void send_message(vector<bool> M, vector<bool> C) {
	M.pb(1);
	
	// Find first good position
	int first = 0;
	while (C[first]) {
		first++;
	}
	
	for (int b = 0; b < 4; b++) {
		majority(CHECK_BIT(first, b));
	}
	
	// Bit in position first send info about freedom, other good bits send the message
	int idx = 0;
	int pos = first + 1;
	while (idx < M.size() || pos < N) {
		vector<bool> packet(N);
		int i = first;

		if (pos < N) {
			packet[first] = C[pos];
			pos++;
			i++;
		}

		while (i < N) {
			if (!C[i]) {
				if (idx < M.size()) {
					packet[i] = M[idx];
					idx++;
				}
				else {
					packet[i] = 0;
				}
			}
			i++;
		}

		send_packet(packet);
	}
}

vector<bool> receive_message(vector<vector<bool>> R) {
	int first = 0;
	int p = 0;
	for (int b = 0; b < 4; b++) {
		int res = count(R[p]);
		first += (res << b);
		p++;
	}

	vector<bool> C(N, true);
	vector<bool> message;
	int pos = first + 1;
	while (pos < N) {
		C[pos] = R[p][first];
		p++;
		pos++;
	}

	p = 4;
	pos = first + 1;
	while (p < R.size()) {
		int i = first;
		
		if (pos < N) {
			i++;
			pos++;
		}

		while (i < N) {
			if (!C[i]) {
				message.pb(R[p][i]);
			}
			i++;
		}

		p++;
	}

	while (message.back() == false) {
		message.pop_back();
	}
	message.pop_back();

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