답안 #591513

# 제출 시각 아이디 문제 언어 결과 실행 시간 메모리
591513 2022-07-07T14:24:25 Z tutis Flight to the Ford (BOI22_communication) C++17
15 / 100
8000 ms 2128 KB
#include <bits/stdc++.h>
using namespace std;
using ll = long long;
int prob = 1;
#include "communication.h"
int dec3(int x)//4 bit x
{
	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[4] = {0, 0, 6, 9};
	for (int i = 1; i <= 3; i++)
	{
		bool ok = true;
		for (int j : ger)
			if (x == (V[i] ^ j))
				ok = false;
		if (ok)
			return i;
	}
	assert(false);
	return 0;
}
int enc3(int X)
{
	int v = 0;
	if (X == 1)
		v = 0;
	else if (X == 2)
		v = 6;
	else if (X == 3)
		v = 9;
	int val = 0;
	for (int t = 0; t < 4; t++)
	{
		val += send(v % 2) << t;
		v /= 2;
	}
	return dec3(val);
}
string S4[4] = {"1000",
                "0001",
                "1110",
                "0111"
               };
int conv4(int i)
{
	int v = 0;
	int p = 1;
	for (char c : S4[i])
	{
		if (c == '1')
			v += p;
		p *= 2;
	}
	return v;
}
bitset<4> dec4(int x)//4 bit x
{
	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);
	}
	bitset<4>ret;
	for (int i = 0; i < 4; i++)
	{
		for (int j : ger)
			if (x == (conv4(i) ^ j))
				ret[i] = true;
	}
	return ret;
}
bitset<4> enc4(int X)
{
	int v = conv4(X);
	int val = 0;
	for (int t = 0; t < 4; t++)
	{
		val += (send(v % 2) << t);
		v /= 2;
	}
	auto ret = dec4(val);
	assert(ret[X] == true);
	return ret;
}
const int bitcnt = 14;
bitset < 1 << bitcnt > decB(int x) //4 bit x
{
	vector<int>ger;
	for (int m = 0; m < (1 << bitcnt); m++)
	{
		bool ok = true;
		int v = m;
		while (v != 0)
		{
			if (v % 4 == 3)
				ok = false;
			v /= 2;
		}
		if (ok)
			ger.push_back(m);
	}
	bitset < 1 << bitcnt > ret;
	int s = 0;
	int i = 0;
	function<void(bool)>f = [&](bool gal)
	{
		if (i == bitcnt)
		{
			ret[x ^ s] = true;
		}
		else
		{
			int del = 1 << i;
			i++;
			if (gal)
			{
				f(true);
				s += del;
				f(false);
				s -= del;
			}
			else
				f(true);
			i--;
		}
	};
	f(true);
	return ret;
}
bitset < 1 << bitcnt > encB(int v)
{
	int val = 0;
	int vv = v;
	for (int t = 0; t < bitcnt; t++)
	{
		val += (send(v % 2) << t);
		v /= 2;
	}
	auto ret = decB(val);
	assert(ret[vv] == true);
	return ret;
}
void encode(int N, int X)
{
	if (N < 3)
		return;
	if (N == 3)
	{
		enc3(X);
		return;
	}
	if (N >= (1 << bitcnt))
	{
		while (N % (1 << bitcnt) != 0)
			N++;
		int v = N / (1 << bitcnt);
		int vv = (X - 1) / v;
		vv = min(vv, (1 << bitcnt) - 1);
		bitset < (1 << bitcnt) > gal = encB(vv);
		int s = 0;
		for (int i = 0; i < (1 << bitcnt); i++)
		{
			if (gal[i])
				s += v;
			else if (i < vv)
				X -= v;
		}
		encode(s, X);
		return;
	}
	if (N >= 4)
	{
		while (N % 4 != 0)
			N++;
		int v = N / 4;
		int vv = (X - 1) / v;
		vv = min(vv, 3);
		bitset<4>gal = enc4(vv);
		int s = 0;
		for (int i = 0; i < 4; i++)
		{
			if (gal[i])
			{
				s += v;
			}
			else if (i < vv)
				X -= v;
		}
		encode(s, X);
		return;
	}
}
pair<int, int> decode(int N)
{
	if (N == 1)
		return {1, 1};
	if (N == 2)
		return {1, 2};
	if (N == 3)
	{
		int val = 0;
		for (int t = 0; t < 4; t++)
			val += receive() << t;
		int v = dec3(val);
		pair<int, int>ans = {1, 2};
		if (v == 1)
			ans.first = 3;
		if (v == 2)
			ans.second = 3;
		return ans;
	}
	if (N >= (1 << bitcnt))
	{
		int N1 = N;
		while (N % (1 << bitcnt) != 0)
			N++;
		int re = 0;
		for (int t = 0; t < bitcnt; t++)
			re += receive() << t;
		bitset < (1 << bitcnt) > gal = decB(re);
		int v = N / (1 << bitcnt);
		int s = 0;
		for (int i = 0; i < (1 << bitcnt); i++)
			if (gal[i])
				s += v;
		pair<int, int>r = decode(s);
		int sum = 0;
		bool ger1 = false;
		bool ger2 = false;
		for (int i = 0; i < (1 << bitcnt); i++)
		{
			if (gal[i])
			{
				if (r.first > sum && r.first <= sum + v && ger1 == false)
				{
					for (int j = 0; j < i; j++)
					{
						if (gal[j] == false)
							r.first += v;
					}
					ger1 = true;
				}
				if (r.second > sum && r.second <= sum + v && ger2 == false)
				{
					for (int j = 0; j < i; j++)
					{
						if (gal[j] == false)
							r.second += v;
					}
					ger2 = true;
				}
				sum += v;
			}
		}
		r.first = min(r.first, N1);
		r.second = min(r.second, N1);
		return r;
	}
	if (N >= 4)
	{
		int N1 = N;
		while (N % 4 != 0)
			N++;
		int re = 0;
		for (int t = 0; t < 4; t++)
			re += receive() << t;
		bitset<4> gal = dec4(re);
		int v = N / 4;
		int s = 0;
		for (int i = 0; i < 4; i++)
			if (gal[i])
				s += v;
		pair<int, int>r = decode(s);
		int sum = 0;
		bool ger1 = false;
		bool ger2 = false;
		for (int i = 0; i < 4; i++)
		{
			if (gal[i])
			{
				if (r.first > sum && r.first <= sum + v && ger1 == false)
				{
					for (int j = 0; j < i; j++)
						if (gal[j] == false)
							r.first += v;
					ger1 = true;
				}
				if (r.second > sum && r.second <= sum + v && ger2 == false)
				{
					for (int j = 0; j < i; j++)
						if (gal[j] == false)
							r.second += v;
					ger2 = true;
				}
				sum += v;
			}
		}
		r.first = min(r.first, N1);
		r.second = min(r.second, N1);
		return r;
	}
	return { -1, -1};
}
// int main()
// {
// 	for (int t = 0; t < 1000; t++)
// 	{
// 		int N = 1e8;
// 		int val = (t % N) + 1;
// 		encode(N, val);
// 		pair<int, int>v = decode(N);
// 		cout << v.first << " " << v.second << endl;
// 		assert(v.first == val || v.second == val);
// 	}
// }
# 결과 실행 시간 메모리 Grader output
1 Correct 7 ms 1772 KB Output is correct
2 Correct 11 ms 1700 KB Output is correct
3 Correct 19 ms 1700 KB Output is correct
4 Correct 11 ms 1608 KB Output is correct
5 Correct 13 ms 1804 KB Output is correct
6 Correct 18 ms 1664 KB Output is correct
7 Correct 43 ms 1708 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Partially correct 1800 ms 1788 KB Output is partially correct
2 Partially correct 948 ms 1852 KB Output is partially correct
3 Partially correct 1052 ms 1804 KB Output is partially correct
4 Partially correct 2050 ms 1872 KB Output is partially correct
5 Partially correct 1699 ms 1672 KB Output is partially correct
6 Partially correct 1404 ms 1692 KB Output is partially correct
7 Partially correct 5406 ms 1920 KB Output is partially correct
8 Execution timed out 8000 ms 2128 KB
9 Halted 0 ms 0 KB -