Submission #1208661

#TimeUsernameProblemLanguageResultExecution timeMemory
1208661k1r1t0Mars (APIO22_mars)C++20
36 / 100
105 ms4080 KiB
#include <bits/stdc++.h>

using namespace std;
using ll = long long;

string process(vector<vector<string>> a, int i, int j, int k, int n) {
	const int S = 100;
	int lp = 2 * (n - k - 1);
	if (i < lp - 1 && j < lp - 1)
		return a[0][0];
	vector<vector<char>> b(2 * n + 1, vector<char>(2 * n + 1));
	if (lp != 0) {
		if (i >= lp - 1 && j >= lp - 1) {
			string cur = a[0][0];
			string right = a[0][2];
			string down = a[2][0];
			string corner = a[2][2];
			b[i][j] = cur[0];
			for (int t = j + 2; t <= 2 * n; t += 2)
				b[i][t] = right[(t - j) / 2 - 1];
			for (int t = i + 2; t <= 2 * n; t += 2)
				b[t][j] = down[(t - i) / 2 - 1];
			int ti = i + 2, tj = j + 2;
			for (char c : corner) {
				b[ti][tj] = c;
				tj += 2;
				if (tj > 2 * n) {
					tj = j + 2;
					ti += 2;
					if (ti > 2 * n)
						break;
				}
			}
			string res;
			for (int ti = i; ti <= 2 * n; ti += 2)
			for (int tj = j; tj <= 2 * n; tj += 2)
				res.push_back(b[ti][tj]);
			//assert((int) res.size() <= S);
			while ((int) res.size() < S)
				res.push_back('0');
			return res;
		}
		if (i < lp - 1) {
			string cur = a[0][0];
			string right = a[0][2];
			for (int i = S - 1; i > 0; i--)
				right[i] = right[i - 1];
			right[0] = cur[0];
			return right;
		}
		string cur = a[0][0];
		string down = a[2][0];
		for (int i = S - 1; i > 0; i--)
			down[i] = down[i - 1];
		down[0] = cur[0];
		return down;
	}
	b[i][j] = a[0][0][0];
	for (int d = 1; d <= 2; d++) {
		for (int t = j + d; t <= 2 * n; t += 2)
			b[i][t] = a[0][d][(t - j - d) / 2];
		for (int t = i + d; t <= 2 * n; t += 2)
			b[t][j] = a[d][0][(t - i - d) / 2];
	}
	for (int di = 1; di <= 2; di++)
	for (int dj = 1; dj <= 2; dj++) {
		int ti = i + di, tj = j + dj;
		for (char c : a[di][dj]) {
			b[ti][tj] = c;
			tj += 2;
			if (tj > 2 * n) {
				tj = j + dj;
				ti += 2;
				if (ti > 2 * n)
					break;
			}
		}
	}
	vector<vector<bool>> used(2 * n + 1, vector<bool>(2 * n + 1, false));
	function<void(int, int)> dfs = [&](int ti, int tj) {
		if (used[ti][tj]) return;
		used[ti][tj] = true;
		for (int di = -1; di <= 1; di++)
		for (int dj = -1; dj <= 1; dj++) {
			if (abs(di) + abs(dj) != 1)
				continue;
			int ni = ti + di;
			int nj = tj + dj;
			if (ni < 0 || ni > 2 * n || nj < 0 || nj > 2 * n || used[ni][nj] || b[ni][nj] == '0')
				continue;
			dfs(ni, nj);
		}
	};
	int ans = 0;
	for (int i = 0; i <= 2 * n; i++)
	for (int j = 0; j <= 2 * n; j++)
		if (!used[i][j] && b[i][j] == '1') {
			ans++;
			dfs(i, j);
		}
	string res;
	while (ans > 0) {
		res.push_back(ans % 2 + '0');
		ans /= 2;
	}
	while ((int) res.size() < S)
		res.push_back('0');
	return res;
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...