Submission #1366518

#TimeUsernameProblemLanguageResultExecution timeMemory
1366518viduxMessage (IOI24_message)C++17
100 / 100
275 ms840 KiB
#include "message.h"
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;

const int INF = 1e9;
void send_packet_d(vector<bool> &a) { static int cnt = 1; cout << setw(2) << cnt++ << ": ";  for (bool x : a) cout << x << " "; cout << endl; send_packet(a); }
void send_message(std::vector<bool> M, std::vector<bool> C) {
	M.push_back(1);
	vector<vector<bool>> a(66, vector<bool>(31));
	vector<int> ds(31);
	for (int i = 0; i < 31; i++) if (!C[i]) {
		int d = 0;
		for (int j = (i+1)%31; ; j = (j+1)%31, d++) if (!C[j]) break;
		ds[i] = d;
		a[d][i] = 1;
	}
	int id = 0;
	for (int i = 0; i < 31; i++) if (!C[i]) {
		for (int j = ds[i]+1; j < 66; j++) {
			if (id >= (int)M.size()) break;
			 a[j][i] = M[id++];
		}
	}
	for (int i = 0; i < 66; i++) send_packet(a[i]);
}

std::vector<bool> receive_message(std::vector<std::vector<bool>> a) {
	vector<int> c(31, 1), ds(31);
	for (int i = 0; i < 31; i++) for (; ds[i] < 20 && !a[ds[i]][i]; ds[i]++);
	bool ok = 0;
	auto dfs = [&](auto dfs, int start, int u, int d, bool f = 0) -> void {
		if (start == u && !f) {
			if (d == 16) ok = 1;
			return;
		}
		if (d > 16) return;
		dfs(dfs, start, (u+ds[u]+1)%31, d+1);
	};
	for (int i = 0; i < 31; i++) {
		dfs(dfs, i, i, 0, 1);
		if (ok) {
			int u = i;
			for (int _ = 0; _ < 16; _++) c[u] = 0, u = (u+ds[u]+1)%31;
			break;
		}
	}
	vector<bool> ans;
	for (int i = 0; i < 31; i++) if (!c[i]) {
		for (int j = ds[i]+1; j < (int)a.size(); j++) {
			 ans.push_back(a[j][i]);
		}
	}
	while (ans.back() == 0) ans.pop_back();
	ans.pop_back();
	return ans;
}
#Result Execution timeMemoryGrader output
Fetching results...
#Result Execution timeMemoryGrader output
Fetching results...
#Result Execution timeMemoryGrader output
Fetching results...