제출 #1366477

#제출 시각아이디문제언어결과실행 시간메모리
1366477vidux메시지 (IOI24_message)C++17
0 / 100
189 ms816 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 << 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);
	while ((int)M.size() < 640) M.push_back(0);
	auto check = [&](int s, int e, int d) -> int {
		for (int i = 0; i < 8; i++) {
			if (C[s+d*i] == 0) {
				return i;
			}
		}
		return -1;
	};
	int f1 = check(0, 30, +1);
	int f2 = check(30, 0, -1);
	auto encode = [&](int x, int d) { // d true - reversed
		vector<bool> a(31);
		a = vector<bool>(31, d == -1);
		send_packet(a);
		for (int i = 0; i < 3; i++) {
			a = vector<bool>(31, (x&(1<<i)) != 0);
			send_packet(a);
		}
	};
	int f = f1;
	if (f1 != -1) encode(f1, 0);
	else f = 30-f2, encode(f2, 0);
	vector<bool> a(31);
	auto flush = [&]() -> void {
		send_packet(a);
		a = vector<bool>(31);
	};
	int x = 0;
	int ai = 0;
	vector<int> pos;
	for (int i = 0; i < 31; i++) if (C[i] == 0) pos.push_back(i);
	for (int i = 0; i < (int)M.size();) {
		if (x == f) x++;
		if (x < 31 && pos[ai] == f) {
			a[pos[ai]] = C[x++];
		}
		else a[pos[ai]] = M[i++];
		ai++;
		if (ai == 16) flush(), ai = 0;
	}
	if (ai) flush();
}

std::vector<bool> receive_message(std::vector<std::vector<bool>> R) {
	auto readblob = [&](vector<bool> a) -> int {
		int one = 0;
		for (bool b : a) one += b;
		return one >= 16;
	};
	int drev = readblob(R[0]);
	int f = readblob(R[1])+readblob(R[2])*2+readblob(R[3])*4;
	if (drev) f = 30-f;
	vector<int> c(31, 1);
	c[f] = 0;
	for (int i = 0, id = 4; i < 31; i++) if (i != f) c[i] = R[id++][f];
	vector<int> pos;
	for (int i = 0; i < 31; i++) if (c[i] == 0) pos.push_back(i);
	vector<bool> ans;
	for (int id = 4, x = 0; id < (int)R.size(); id++, x++) {
		for (int p : pos) if (p != f || x >= 30) ans.push_back(R[id][p]);
	}
	while (ans.back() == 0) ans.pop_back();
	ans.pop_back();
	return ans;
}
#결과 실행 시간메모리채점기 출력
결과를 불러오는 중입니다…
#결과 실행 시간메모리채점기 출력
결과를 불러오는 중입니다…
#결과 실행 시간메모리채점기 출력
결과를 불러오는 중입니다…