Submission #1197713

#TimeUsernameProblemLanguageResultExecution timeMemory
1197713ansoriMessage (IOI24_message)C++20
79.64 / 100
435 ms852 KiB
#include "message.h"

#include<bits/stdc++.h>
using namespace std;
vector<bool> send_packet(vector<bool> A);
void send_message(std::vector<bool> M, std::vector<bool> C) {
  int p0;
  for(int i = 0;i < 31; ++ i){
  	if(! C[i]){
  		p0 = i;
  		for(int j = 0;j < 4; ++ j){
  			send_packet(vector<bool> (31 , ((i & (1 << j)) > 0)));
  		}
  		break;
  	}
  }
  int c1 = 0 , sz = 0 , szm = M.size();
  for(int i = 0;i < 31; ++ i){
  	if(i == p0) continue ;
  	vector<bool> v(31 , 0);
  	for(int j = 0;j < 31; ++ j){
  		if(j != p0 and C[j] == 0 and sz < szm){
  			v[j] = M[sz ++];
  		}
  		if(j == p0) v[j] = C[i];
  	}
  	send_packet(v);
  }
  int b = 0;
  vector<bool> v(31 , 0);
  for(int i = 0;i < 31; ++ i){
  	if(C[i] == 0){
  		if(b <= 10){
  			if(szm & (1 << b)) v[i] = 1;
  			else v[i] = 0;
  			b ++;
  		}
  		else{
  			if(sz < szm){
  				v[i] = M[sz ++];
  			}
  		}
  	}
  }
  send_packet(v);
  while(sz < szm){
  	v = vector<bool> (31 , 0);
  	for(int i = 0;i < 31; ++ i){
  		if(C[i] == 0 and sz < szm){
  			v[i] = M[sz ++];
  		}
  	}
  	send_packet(v);
  }
}
std::vector<bool> receive_message(std::vector<std::vector<bool>> R) {
	vector<bool> msg;
	deque<vector<bool>> p;
	//cout << -1;
	for(auto to : R) p.push_back(to);
	int p0 = 0;
	for(int i = 0;i < 4; ++ i){
		int a = 0;
		for(int j = 0;j < 31; ++ j){
			if(p[i][j]) a ++;
			else a --;
		}
		if(a > 0) p0 += (1 << i);
	}
	for(int i = 0;i < 4; ++ i) p.pop_front();
	vector<bool> c(31 , 0);
	c[p0] = 0;
	int ps = 0;
	for(int i = 0;i < 31; ++ i){
		if(i == p0) continue ;
		c[i] = p[ps][p0];
		ps ++;
	}
	int szm = 0;
	for(int i = 0;i < 30; ++ i){
		for(int j = 0;j < 31; ++ j){
			if(j != p0 and c[j] == 0){
				szm ++;
				msg.push_back(p[i][j]);
			}
		}
	}
	for(int i = 0;i < 30; ++ i) p.pop_front();
	int b = 0 , rsz = 0;
	for(int i = 0;i < 31; ++ i){
		if(c[i] == 0){
			if(b <= 10){
				if(p[0][i]) rsz += (1 << b);
				b ++;
			}
			else{
				msg.push_back(p[0][i]);
			}
		}
	}
	p.pop_front();
	while(msg.size() < rsz){
		for(int i = 0;i < 31; ++ i){
			if(c[i] == 0) msg.push_back(p[0][i]);
		}
		p.pop_front();
	}
	while(msg.size() > rsz) msg.pop_back();
  	return msg;
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...