Submission #1362837

#TimeUsernameProblemLanguageResultExecution timeMemory
1362837MateiKing80Casino (JOI26_casino)C++20
100 / 100
244 ms844 KiB
#include "Azzurro.h"

std::vector<std::vector<int>> Azzurro(int n, int l, std::string s) {
	while ((int)s.size() < n * n - 2 * n + 3) {
		s += 'A';
	}
	std::vector<std::vector<int>> x(n, std::vector<int>(n, 0));
	x[0][0] = (s[0] == 'B');
	x[n - 1][n - 1] = (s.back() == 'B');
	int alc = 1;
	for (int sum = 1; sum < 2 * n - 2; sum ++) {
		bool primu = false;
		for (int i = 0; i < n; i ++) {
			int j = sum - i;
			if (j < 0 || j >= n) {
				continue;
			}
			if (!primu) {
				primu = true;
				int xr = 0;
				for (int k = i + 2; k < n; k += 2) {
					int l = sum - k;
					if (l < 0 || l >= n) {
						break;
					}
					xr ^= (s[alc + k - i - 1] == 'B');
				}
				x[i][j] = xr;
			} else {
				x[i][j] = (s[alc ++] == 'B');
			}
		}
	}
	return x;
}
#include "Bordeaux.h"

std::string Bordeaux(int n, int l, std::vector<std::vector<int>> x) {
	std::vector<int> ans;
	ans.push_back(x[0][0] ^ 1);
	int lprec = 0;
	for (int sum = 1; sum < 2 * n - 2; sum ++) {
		bool primu = false;
		for (int i = 0; i < n; i ++) {
			int j = sum - i;
			if (j < 0 || j >= n) {
				continue;
			}
			if (!primu) {
				primu = true;
				int xr = 0;
				for (int k = i; k < n; k += 2) {
					int l = sum - k;
					if (l < 0 || l >= n) {
						break;
					}
					xr ^= x[k][l];
				}
				
				if (!((lprec ^ xr ^ i) & 1)) {
					lprec ++;
				}
				
				x[lprec][sum - lprec] ^= 1;
			} else {
				ans.push_back(x[i][j]);
			}
		}
	}
	ans.push_back(x[n - 1][n - 1] ^ 1);
	
	std::string s;
	for (auto i : ans) {
		if (i) {
			s += 'B';
		} else {
			s += 'A';
		}
	}
	while ((int)s.size() > l) {
		s.pop_back();
	}
	return s;
}
#Result Execution timeMemoryGrader output
Fetching results...