Submission #590126

#TimeUsernameProblemLanguageResultExecution timeMemory
590126dutinmeowSandwich (JOI16_sandwich)C++17
100 / 100
1987 ms2644 KiB
#include <bits/stdc++.h>
using namespace std;

#pragma region y_combinator

#ifndef Y_COMBINATOR_HPP
#define Y_COMBINATOR_HPP

template<class Fun>
class y_combinator_result {
	Fun fun_;
public:
	template<class T>
	explicit y_combinator_result(T &&fun) : fun_(std::forward<T>(fun)) {}

	template<class ...Args>
	decltype(auto) operator()(Args &&...args) {
		return fun_(std::ref(*this), std::forward<Args>(args)...);
	}
};

template<class Fun>
decltype(auto) y_combinator(Fun &&fun) {
	return y_combinator_result<std::decay_t<Fun>>(std::forward<Fun>(fun));
}

#endif

#pragma endregion y_combinator

const int INF = 1e9;
const array<int, 4> dx = {1, 0, -1, 0}, dy = {0, 1, 0, -1};

int main() {
	int N, M;
	cin >> N >> M;
	vector<vector<char>> A(N + 2, vector<char>(M + 2));
	for (int i = 1; i <= N; i++)
		for (int j = 1; j <= M; j++)
			cin >> A[i][j];

	int time = 0;
	vector<vector<bool>> vis(N + 2, vector<bool>(M + 2, false)), inq(N + 2, vector<bool>(M + 2, false));

	auto dfs = y_combinator([&](auto dfs, int x, int y, int t) -> void {
		if (time >= INF || inq[x][y]) 
			return void(time = INF);
		if (x <= 0 || x > N || y <= 0 || y > M || vis[x][y])
			return;
		vis[x][y] = inq[x][y] = true;
		time++;
		dfs(x + dx[t], y + dy[t], t);
		if (A[x][y] == 'Z') {
			int s = (t ^ 1);
			dfs(x + dx[s], y + dy[s], s);
		} else {
			int s = (t ^ 1 ^ 2);
			dfs(x + dx[s], y + dy[s], s);
		}
		inq[x][y] = false;
	});
	
	vector<vector<int>> ans(N + 2, vector<int>(M + 2, INF));
	for (int t : {1, 3}) {
		for (int i = N; i >= 1; i--) {
			for (int j = 1; j <= N; j++) {
				fill(vis[j].begin(), vis[j].end(), false);
				fill(inq[j].begin(), inq[j].end(), false);
			}
			time = 0;
			if (t == 3) {
				for (int j = 1; j <= M; j++) {
					dfs(i, j, t);
					ans[i][j] = min(ans[i][j], time);
				}
			} else {
				for (int j = M; j >= 1; j--) {
					dfs(i, j, t);
					ans[i][j] = min(ans[i][j], time);
				}
			}
		}
	}
	for (int i = 1; i <= N; i++) 
		for (int j = 1; j <= M; j++) 
			cout << (ans[i][j] >= INF ? -1 : ans[i][j] * 2) << " \n"[j == M];
}

Compilation message (stderr)

sandwich.cpp:4: warning: ignoring '#pragma region y_combinator' [-Wunknown-pragmas]
    4 | #pragma region y_combinator
      | 
sandwich.cpp:29: warning: ignoring '#pragma endregion y_combinator' [-Wunknown-pragmas]
   29 | #pragma endregion y_combinator
      |
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...