Submission #1171798

#TimeUsernameProblemLanguageResultExecution timeMemory
1171798xnqsDango Maker (JOI18_dango_maker)C++20
13 / 100
0 ms328 KiB
#include <iostream>
#include <fstream>
#include <vector>
#include <queue>
#include <utility>
#include <algorithm>

int x, y;
char arr[3005][3005];
bool real_node[18000005];
bool vis[18000005];
std::vector<std::vector<int>> adj_list;

int Not(int node) {
	return ((node < x*y) ? node+x*y : node-x*y);
}

inline bool ok_line(int i, int j) {
	return arr[i][j] == 'R' && arr[i][j+1] == 'G' && arr[i][j+2] == 'W';
}

inline bool ok_column(int i, int j) {
	return arr[i][j] == 'R' && arr[i+1][j] == 'G' && arr[i+2][j] == 'W';
}

std::pair<int,int> dfs(int k) {
	vis[k] = 1;
	std::pair<int,int> ret(1,0);
	for (const auto& i : adj_list[k]) {
		if (!vis[i]) {
			auto [a, b] = dfs(i);
			ret.second += a;
			ret.first += b;
		}
	}
	return ret;
}

int main() {
	std::ios_base::sync_with_stdio(false);
	std::cin.tie(NULL);
	std::cout.tie(NULL);

	std::cin >> x >> y;
	adj_list.resize(2*x*y);
	for (int i = 0; i < x; i++) {
		std::cin >> arr[i];
	}

	for (int i = 0; i < x; i++) {
		for (int j = 0; j+2 < y; j++) {
			if (ok_line(i,j)) {
				real_node[i*y+j] = 1;
				if (i+2 < x && ok_column(i,j)) {
					adj_list[i*y+j].emplace_back(Not(i*y+j));
				}
				if (i-1 >= 0 && i+1 < x && ok_column(i-1,j+1)) {
					adj_list[i*y+j].emplace_back(Not((i-1)*y+j+1));
				}
				if (i-2 >= 0 && ok_column(i-2,j+2)) {
					adj_list[i*y+j].emplace_back(Not((i-2)*y+j+2));
				}
			}
		}
	}
	for (int i = 0; i+2 < x; i++) {
		for (int j = 0; j < y; j++) {
			if (ok_column(i,j)) {
				real_node[Not(i*y+j)] = 1;
				if (j+2 < y && ok_line(i,j)) {
					adj_list[Not(i*y+j)].emplace_back(i*y+j);
				}
				if (j-1 >= 0 && j+1 < y && ok_line(i+1,j-1)) {
					adj_list[Not(i*y+j)].emplace_back((i+1)*y+j-1);
				}
				if (j-2 >= 0 && ok_line(i+2,j-2)) {
					adj_list[Not(i*y+j)].emplace_back((i+2)*y+j-2);
				}
			}
		}
	}

	int ret = 0;
	for (int i = 0; i < 2*x*y; i++) {
		if (real_node[i]&&!vis[i]) {
			auto [a, b] = dfs(i);
			ret += std::max(a, b);
		}
	}

	std::cout << ret << "\n";
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...