답안 #590854

# 제출 시각 아이디 문제 언어 결과 실행 시간 메모리
590854 2022-07-06T12:18:58 Z tutis Flight to the Ford (BOI22_communication) C++17
15 / 100
41 ms 1904 KB
#include <bits/stdc++.h>
using namespace std;
int prob = 1;
#include "communication.h"
void encode(int N, int X)
{
	X--;
	if (X == 0)
	{
		send(0);
		send(0);
		send(0);
		send(0);
	}
	if (X == 1)
	{
		send(0);
		send(1);
		send(1);
		send(0);
	}
	if (X == 2)
	{
		send(1);
		send(0);
		send(0);
		send(1);
	}
}
pair<int, int> decode(int N)
{
	mt19937_64 rng(1832);
	int val = 0;
	for (int t = 0; t < 4; t++)
		val += receive() << t;
	vector<int>ans;
	vector<int>ger;
	for (int m = 0; m < 16; m++)
	{
		bool ok = true;
		int v = m;
		while (v != 0)
		{
			if (v % 4 == 3)
				ok = false;
			v /= 2;
		}
		if (ok)
			ger.push_back(m);
	}
	int V[3] = {0, 6, 9};
	for (int i = 0; i < 3; i++)
	{
		for (int j : ger)
			if (val == (V[i] ^ j))
				ans.push_back(i);
	}
	for (int &i : ans)
		i++;
	if (ans.size() == 1)
		return{ans[0], ans[0]};
	assert(ans.size() >= 2);
	return {ans[0], ans[1]};
}
// int main()
// {
// 	vector<int>ger;
// 	for (int m = 0; m < 16; m++)
// 	{
// 		bool ok = true;
// 		int v = m;
// 		while (v != 0)
// 		{
// 			if (v % 4 == 3)
// 				ok = false;
// 			v /= 2;
// 		}
// 		if (ok)
// 			ger.push_back(m);
// 	}
// 	int a = 0;
// 	{
// 		for (int b = 0; b < 16; b++)
// 		{
// 			for (int c = 0; c < 16; c++)
// 			{
// 				if (a == b || b == c || c == a)
// 					continue;
// 				set<int>A;
// 				set<int>B;
// 				set<int>C;
// 				for (int i : ger)
// 				{
// 					A.insert(i ^ a);
// 					B.insert(i ^ b);
// 					C.insert(i ^ c);
// 				}
// 				bool ok = true;
// 				for (int i : ger)
// 				{
// 					int v1 = i ^ b;
// 					int v2 = i ^ c;
// 					if (A.count(v1) > 0 && A.count(v2) > 0)
// 					{
// 						ok = false;
// 						break;
// 					}
// 				}
// 				for (int i : ger)
// 				{
// 					int v1 = i ^ a;
// 					int v2 = i ^ c;
// 					if (B.count(v1) > 0 && B.count(v2) > 0)
// 					{
// 						ok = false;
// 						break;
// 					}
// 				}
// 				for (int i : ger)
// 				{
// 					int v1 = i ^ a;
// 					int v2 = i ^ b;
// 					if (C.count(v1) > 0 && C.count(v2) > 0)
// 					{
// 						ok = false;
// 						break;
// 					}
// 				}
// 				if (ok)
// 				{
// 					// cout << bitset<4>(a) << endl;
// 					// cout << bitset<4>(b) << endl;
// 					// cout << bitset<4>(c) << endl;
// 					// cout << endl;
// 				}
// 			}
// 		}
// 	}
// 	for (int t = 0; t < 1000; t++)
// 	{
// 		int N = 3;
// 		int val = (t % N) + 1;
// 		encode(N, val);
// 		pair<int, int>v = decode(N);
// 		assert(v.first == val || v.second == val);
// 		cout << v.first << " " << v.second << endl;
// 	}
// }
# 결과 실행 시간 메모리 Grader output
1 Correct 12 ms 1896 KB Output is correct
2 Correct 12 ms 1796 KB Output is correct
3 Correct 13 ms 1760 KB Output is correct
4 Correct 8 ms 1776 KB Output is correct
5 Correct 13 ms 1856 KB Output is correct
6 Correct 28 ms 1904 KB Output is correct
7 Correct 41 ms 1636 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Incorrect 11 ms 200 KB Not correct
2 Halted 0 ms 0 KB -