제출 #1343357

#제출 시각아이디문제언어결과실행 시간메모리
1343357thesentro메시지 (IOI24_message)C++20
29.32 / 100
554 ms840 KiB
#include "message.h"
#include <bits/stdc++.h>
using namespace std;
#define ll long long
void send_message(std::vector<bool> M, std::vector<bool> C) {
	for (int i=0 ; i<C.size() ; i++)
	{
		vector<bool>v(31, C[i]);
		send_packet(v);
	}
	vector<bool>snd(31, 0);
	ll id = 0;
	ll ex = -1;
	while (ex==-1)
	{
		for (int i=0 ;i<31 ; i++)
		{
			if (C[i]==1) continue;
			snd[i] = M[id++];
			if (id==M.size())
			{
				ex = i;
				break;
			}
		}
		send_packet(snd);
	}
	snd.assign(31, 0);
	vector<ll>bit;
	for (int i=0 ; i<31 ; i++)
	{
		if ((1<<i)&ex)
			bit.push_back(1);
		else
			bit.push_back(0);
	}
	id = 0;
	for (int i=0 ; i<31 ; i++)
	{
		if (C[i]==1) continue;
		snd[i] = bit[id++];
	}
	send_packet(snd);
}

std::vector<bool> receive_message(std::vector<std::vector<bool>> R) {
	vector<bool>c;
	for (int it=0 ; it<31 ; it++)
	{
		auto i = R[it];
		ll cnt1=0, cnt0=0;
		for (auto j:i)
		{
			if (j==0) cnt0++; else cnt1++;
		}
		c.push_back(((cnt0>cnt1)? 0:1));
	}
	ll end = 0;
	auto it = R[R.size()-1];
	ll j = 0;
	for (int i=0 ; i<it.size() ; i++)
	{
		if (c[i]) continue;
		end += (1<<j)*it[i];
		j++;
	}
	vector<bool>res;
	for (int it=31 ; it<R.size()-1 ; it++)
	{
		ll un = 30;
		if (it==R.size()-2) un = end;
		for (int i=0 ; i<=un ; i++)
		{
			if (c[i]) continue;
			res.push_back(R[it][i]);
		}
	}
	return res;
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...