제출 #1248272

#제출 시각아이디문제언어결과실행 시간메모리
1248272lukav메시지 (IOI24_message)C++20
0 / 100
109 ms848 KiB
#include <bits/stdc++.h>
using namespace std;
#define ll long long
#define vec vector

string to_string(vec<bool> numbers) {
	string text = "{";
	for (auto i = numbers.begin(); i != numbers.end(); i++) {
		text += to_string(*i);
		if (next(i) != numbers.end()) {text += ", ";}
	} text += '}';
	return text;
}
string to_string(vec<vec<bool>> numbers) {
	int j = 0;
	string text = "{";
	for (auto i = numbers.begin(); i != numbers.end(); i++) {
		text += to_string(j) + ": " + to_string(*i);
		if (next(i) != numbers.end()) {text += "\n";}
		j++;
	} text += '}';
	return text;
}
vec<bool> receive_message(vec<vec<bool>> R) {
	int leftbound = 0, rightbound = 30;
	while (leftbound < rightbound) {
		vec<bool> packet = R[0];
		R.erase(R.begin());
		int numofzeros = 0, numofones = 0;
		for (int i = 0; i < 31; i++) {
			if (packet[i] == 0) {numofzeros++;}
			else {numofones++;}
		}
		int temp = (leftbound + rightbound) / 2;
		if (numofzeros >= 16) {rightbound = temp;}
		else {leftbound = temp + 1;}
	} int index = leftbound;

	vec<bool> C(31, 1);
	if (index == 30) {C = {0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0};}
	else {
		C[index] = C[index + 1] = 0;
		int indexofC = 0;
		for (int i = 0; i < 15; i++) {
			if (indexofC == index) {indexofC += 2;}
			if (indexofC == index + 1) {indexofC++;}
			if (indexofC < 31) {
				C[indexofC] = R[i][index];
				indexofC++;
			} if (indexofC < 31) {
				C[indexofC] = R[i][index + 1];
				indexofC++;
			}
		}
	}
	vec<bool> packet = R[R.size() - 1];
	R.erase(R.begin() + (R.size() - 1));
	vec<bool> binary;
	int i = 0;
	for (int j = 0; j < 31; j++) {
		if (C[j] == 0) {
			binary.push_back(packet[j]);
			i++;
		} if (i == 11) {break;}
	}
	int poweroftwo = 1024;
	int n = 0;
	for (int j = 0; j < 11; j++) {
		n += binary[j] * poweroftwo;
		poweroftwo /= 2;
	}
	vec<bool> M;
	int decoded = 0, ii = 0, jj = 0;
	while (decoded < n) {
		if (C[jj] == 0) {
			if (ii <= 14 && index != 30) {
				if (jj != index && jj != index + 1) {
					M.push_back(R[ii][jj]);
					decoded++;
				}
			} else {
				M.push_back(R[ii][jj]);
				decoded++;
			}
		} jj++;
		if (jj == 31) {jj = 0; ii++;}
	}
	return M;
}
vec<bool> send_packet(vec<bool> A);
void send_message(vec<bool> M, vec<bool> C) {
	int n = M.size(), index = 30;
	for (int i = 0; i < 30; i++) {if (C[i] == 0 && C[i + 1] == 0) {index = i; break;}}
	
	vec<vec<bool>> packets, newpackets;

	int leftbound = 0, rightbound = 30;
	while (leftbound < rightbound) {
		int temp = (leftbound + rightbound) / 2, value;
		if (index > temp) {
			leftbound = temp + 1;
			value = 1;
		} else {
			rightbound = temp;
			value = 0;
		} vec<bool> packet(31, value);
		packets.push_back(packet);
	}
	for (int i = 0; i < 15; i++) {newpackets.push_back(vec<bool>(31, 0));}
	if (index != 30) {
		int indexofC = 0;
		for (int i = 0; i < 15; i++) {
			if (indexofC == index) {indexofC += 2;}
			if (indexofC < 31) {
				newpackets[i][index] = C[indexofC];
				indexofC++;
			} if (indexofC < 31) {
				newpackets[i][index + 1] = C[indexofC];
				indexofC++;
			}
		}
	}
	int encoded = 0, i = 0, j = 0;
	while (encoded < n) {
		if (C[j] == 0) {
			if (i <= 14 && index != 30) {
				if (j != index && j != index + 1) {
					newpackets[i][j] = M[encoded];
					encoded++;
				}
			} else {
				newpackets[i][j] = M[encoded];
				encoded++;
			}
		} j++;
		if (j == 31) {
			j = 0;
			i++;
			if (i >= 15) {newpackets.push_back(vec<bool>(31, 0));}
		}
	}
	packets.insert(packets.end(), newpackets.begin(), newpackets.end());

	vec<bool> binary;
	int poweroftwo = 1024;
	while (poweroftwo != 0) {
		if (n >= poweroftwo) {
			n -= poweroftwo;
			binary.push_back(1);
		} else {
			binary.push_back(0);
		} poweroftwo /= 2;
	}
	vec<bool> packet(31, 0);
	i = 0;
	for (int j = 0; j < 31; j++) {
		if (C[j] == 0) {
			packet[j] = binary[i];
			i++;
		} if (i == 11) {break;}
	} packets.push_back(packet);
	
	for (int k = 0; k < packets.size(); k++) {
		send_packet(packets[k]);
	}
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...