Submission #1343415

#TimeUsernameProblemLanguageResultExecution timeMemory
1343415thesentroMessage (IOI24_message)C++20
43.96 / 100
428 ms844 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) {
	ll cnt =0;
	ll f = 0;
	vector<ll>sv;
	ll idd = 0;
	vector<bool>go(31, 0);
	vector<ll>oth;
	for (int i=0 ; i<C.size() ; i++)
	{
		if (f==0)
		{
			vector<bool>v(31, C[i]);
			send_packet(v);
			if (!C[i]) sv.push_back(i);
			if (sv.size()==2)
			{
				f = 1;
			}
		}
		else
		{
			go[sv[idd++]] = C[i];
			if (!C[i]) oth.push_back(i);
			if (idd==sv.size() or i==C.size()-1){
				send_packet(go);
				go.assign(31, 0);
				for (auto k:oth) sv.push_back(k);
				idd = 0;
				oth.clear();
			}
		}
	}
	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;
	ll f = 0;
	vector<ll>sv;
	ll id = 0;
	vector<bool>go(31, 0);
	vector<ll>oth;
	ll lst = -1;
	for (int it=0 ; c.size()<31; it++)
	{
		lst = it;
		if (f==0)
		{
			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));
			if (c[c.size()-1]==0)
				sv.push_back(c.size()-1);
			if (sv.size()==2)	
				f = 1;
		}
		else
		{
			ll cn = 1;
			for (auto j:sv)
			{
				if (c.size()==31) break;
				c.push_back(R[it][j]);
				if (!R[it][j])
					oth.push_back(c.size()-1);
			}
			for (auto j:oth) sv.push_back(j);
			oth.clear();
		
		}
	}
	// for (int j=0 ;  j<31 ; j++) cout<<c[j]<<" ";
	// cout<<endl;
	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=lst+1 ; 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]);
		}
	}
	// for (auto i:res) cout<<i<<" ";
	return res;
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...