Submission #1233563

#TimeUsernameProblemLanguageResultExecution timeMemory
1233563AMnuMessage (IOI24_message)C++20
100 / 100
382 ms848 KiB
#include "message.h"
#include <bits/stdc++.h>
using namespace std;

int A[31], cnt;
vector <int> v;

void send_message(vector<bool> M, vector<bool> C) {
	M.push_back(1);
	while (M.size() < 1025) {
		M.push_back(0);
	}
	v.clear();
	for (int i=0;i<31;i++) {
		if (C[i]) {
			A[i] = 67;
		}
		else {
			v.push_back(i);
		}
	}
	v.push_back(v[0]+31);
	for (int i=0;i<16;i++) {
		A[v[i]] = v[i+1]-v[i];
	}
	cnt = 0;
	vector<bool> B(31, 0);
	for (int i=1;i<=66;i++) {
		for (int j=0;j<31;j++) {
			if (i == A[j]) {
				B[j] = 1;
			}
			if (i > A[j]) {
				B[j] = M[cnt];
				cnt++;
			}
		}
		send_packet(B);
	}
}

vector<bool> receive_message(vector<vector<bool> > R) {
	vector<bool> ans;
	for (int i=0;i<31;i++) {
		A[i] = 31;
		for (int j=0;j<30;j++) {
			if (R[j][i]) {
				A[i] = j+1;
				break;
			}
		}
	}
	for (int i=0;i<31;i++) {
		if (!A[i]) continue;
		v.clear();
		int j=i, tmp;
		while (A[j]) {
			v.push_back(j);
			tmp = A[j];
			A[j] = 0;
			j=(j+tmp)%31;
		}
		if (v.size() < 16) continue;
		reverse(v.begin(),v.end());
		while (v.size() > 16) {
			v.pop_back();
		}
		sort(v.begin(),v.end());
		break;
	}
	v.push_back(v[0]+31);
	for (int i=0;i<16;i++) {
		A[v[i]] = v[i+1]-v[i];
	}
	v.pop_back();
	for (int i=0;i<66;i++) {
		for (int j : v) {
			if (i >= A[j]) {
				ans.push_back(R[i][j]);
			}
		}
	}
	while (!ans.back()) {
		ans.pop_back();
	}
	ans.pop_back();
	return ans;
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...