Submission #1221960

#TimeUsernameProblemLanguageResultExecution timeMemory
1221960Dan4Life메시지 (IOI24_message)C++20
53.89 / 100
429 ms868 KiB
#include "message.h"
#include <bits/stdc++.h>
using namespace std;

#define pb push_back
#define sz(a) (int)a.size()
#define all(a) begin(a),end(a)

using ll = long long;
using ar2 = array<int,2>;
using ar3 = array<int,3>;
using vi = vector<int>;
using vll = vector<ll>;
using vb = vector<bool>;

const int mxN = (int)1e5+10;
const int INF = (int)1e9+10;
const ll LINF = (ll)1e18+10;

int n, USED; 
vb packet;
vi C;

void send(int x){
	while(1){
		while(sz(packet)<31){
			int cur = sz(packet);
			if(C[cur]) packet.pb(0);
			else if(C[cur]==0){ packet.pb(x); return; }
		}
		send_packet(packet); packet.clear(); USED++;
	}
}

void send_message(vb M, vb c) {
	C.clear(); C.resize(31,1); packet.clear(); USED = 0;
	int bad = 0, good = 0, i = 0;
	
	while(i<31 and bad<15 and !good){
		vb xd(31,c[i]); send_packet(xd);
		C[i] = c[i]; good+=!C[i], bad+=C[i], i++; USED++;
	}
	while(i<31 and bad<15 and good<16){
		send(c[i]); C[i] = c[i]; 
		good+=!C[i], bad+=C[i], i++;
	}
	for(int k = i; k < 31; k++) C[k]=(bad==15?0:1);
	n = sz(M); if(n==1024) n=0;
	for(int i = 0; i < 10; i++) send(n>>i&1);
	for(auto u : M) send(u);
	if(sz(packet)){
		while(sz(packet)<31) packet.pb(0); 
		send_packet(packet); packet.clear();
	}
}

vb receive_message(vector<vb> R) {
	vb ans; ans.clear();
	vi C; C.clear(); C.resize(31,1);
	int bad = 0, good = 0, i=0,j=0,cur_C;
	while(i<sz(R) and bad<15 and !good){
		int num = accumulate(all(R[i]),0);
		bool bit = num>=16;
		if(bit) bad++;
		else good++;
		C[i] = bit; i++;
	}
	if(bad==15){
		for(int k = 15; k < 31; k++) C[k] = 0;
	}
	else{
		cur_C=i; j = 0;
		while(bad<15 and good<16){
			if(!C[j]){
				C[cur_C++]=R[i][j];
				if(R[i][j]) bad++;
				else good++;
			}
			j++; if(j==31) i++,j=0;
		}
		for(int k = cur_C; k < 31; k++) C[k] = (bad==15?0:1);
	}

	
	int bits = 0, n = 0;
	while(i<sz(R)){
		if(!C[j]){
			if(bits<10) n|=R[i][j]*(1<<bits),bits++;
			else{
				if(n==0) n=1024;
				if(sz(ans)==n) return ans;
				ans.pb(R[i][j]);
			}
		}
		j++; if(j==31) i++,j=0;
	}
	return ans;
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...