Submission #1123160

#TimeUsernameProblemLanguageResultExecution timeMemory
1123160Mousa_AboubakerMessage (IOI24_message)C++20
37.66 / 100
739 ms856 KiB
#include "message.h"
#include <bits/stdc++.h>
using namespace std;

void send_message(vector<bool> M, vector<bool> C)
{
	vector<int> idx;
	for(int i = 0; i < (int)C.size(); i++)
		if(C[i] == 0)
			idx.push_back(i);
	for(int i = 15; i > 0; i--)
		idx[i] = idx[i] - idx[i - 1] - 1;
	vector<int> idx2;
	int sum = 0;
	for(int i = 0; i < 4; i++)
	{
		for(int j = 0; j < 4; j++)
			send_packet(vector<bool>(31, ((idx[i] >> j) & 1)));
		idx2.push_back(idx[i] + sum);
		sum += idx[i] + 1;
	}
	for(int i = 4; i < 8; i++)
	{
		vector<bool> b;
		for(int j = 0; j < 4; j++)
			b.push_back((idx[i] >> j) & 1);
		vector<bool> a(31, 0);
		for(int j = 0; j < 4; j++)
			a[idx2[j]] = b[j];
		idx2.push_back(idx[i] + sum);
		sum += idx[i] + 1;
		send_packet(a);
	}
	for(int i = 8; i < 16; i += 2)
	{
		vector<bool> b, c;
		for(int j = 0; j < 4; j++)
		{
			b.push_back((idx[i] >> j) & 1);
			c.push_back((idx[i + 1] >> j) & 1);
		}
		vector<bool> a(31, 0);
		for(int j = 0; j < 4; j++)
		{
			a[idx2[j]] = b[j];
			a[idx2[j + 4]] = c[j];
		}
		idx2.push_back(idx[i] + sum);
		sum += idx[i] + 1;
		idx2.push_back(idx[i + 1] + sum);
		sum += idx[i + 1] + 1;
		send_packet(a);
	}
	{
		int sz = (int)M.size();
		vector<bool> b;
		for(int j = 0; j < 10; j++)
			b.push_back((sz >> j) & 1);
		vector<bool> a(31, 0);
		for(int j = 0; j < 10; j++)
			a[idx2[j]] = b[j];
		send_packet(a);
	}
	int curr = 0;
	vector<bool> a(31, 0);
	for(int i = 0; i < (int)M.size(); i++)
	{
		a[idx2[curr++]] = M[i];
		if(curr == 16)
		{
			send_packet(a);
			a.assign(31, 0);
			curr = 0;
		}
	}
	if(curr)
		send_packet(a);
}

vector<bool> receive_message(vector<vector<bool>> R)
{
	vector<bool> M(31, 1);
	int n = (int)R.size();
	vector<int> b;
	int sum = 0;
	for(int i = 0; i < 4; i++)
	{
		int idx = 0;
		for(int j = 0; j < 4; j++)
		{
			int k = i * 4 + j;
			int cnt0 = 0;
			for(auto l: R[k])
				cnt0 += !l;
			if(cnt0 < 16)
				idx |= (1 << j);
		}
		M[idx] = 0;
		b.push_back(idx + sum);
		sum += idx + 1;
	}
	for(int i = 16; i < 20; i++)
	{
		int idx = 0;
		for(int j = 0; j < 4; j++)
		{
			if(R[i][b[j]] == 1)
				idx |= (1 << j);
		}
		M[idx] = 0;
		b.push_back(idx + sum);
		sum += idx + 1;
	}
	for(int i = 20; i < 24; i++)
	{
		int idx1 = 0, idx2 = 0;
		for(int j = 0; j < 4; j++)
		{
			if(R[i][b[j]] == 1)
				idx1 |= (1 << j);
			if(R[i][b[j + 4]] == 1)
				idx2 |= (1 << j);
		}
		M[idx1] = M[idx2] = 0;
		b.push_back(idx1 + sum);
		sum += idx1 + 1;
		b.push_back(idx2 + sum);
		sum += idx2 + 1;
	}
	int sz = 0;

	for(int i = 0; i < 10; i++)
		if(R[24][b[i]] == 1)
			sz |= (1 << i);
	vector<bool> res;
	int x = 0;
	for(int i = 25; i < n; i++)
	{
		for(int j = 0; j < 16; j++)
		{
			if(R[i][b[j]] == 0)
				res.push_back(0);
			else
				res.push_back(1);
			x++;
			if(x == sz)
				break;
		}
	}

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