Submission #962381

#TimeUsernameProblemLanguageResultExecution timeMemory
962381vjudge1Dango Maker (JOI18_dango_maker)C++14
33 / 100
2032 ms36700 KiB
#include <bits/stdc++.h>

using namespace std;

const int N = 3010;
const string d = "RGW";

int n, m, ans;
int f[N][N], cnt[N][N];
string c[N];
vector<pair<pair<int, int>, bool>> p;

namespace Subtask1 {
	bool check() {
		return n <= 5 && m <= 5;
	}
	int len = 0;
	void dfs(int x, int num) {
		if (ans >= num + len - x + 1) return;
		if (x == len) {
			for (int i = 1; i <= n; i++)
				for (int j = 1; j <= m; j++) 
					if (cnt[i][j] > 1) return;
			ans = max(ans, num);
			return;
		}
		dfs(x + 1, num);
		if (p[x].second) {
			for (int i = p[x].first.first; i <= p[x].first.first + 2; i++) 
				cnt[i][p[x].first.second]++;
		} else {
			for (int i = p[x].first.second; i <= p[x].first.second + 2; i++) 
				cnt[p[x].first.first][i]++;
		}
		dfs(x + 1, num + 1);
		if (p[x].second) {
			for (int i = p[x].first.first; i <= p[x].first.first + 2; i++) 
				cnt[i][p[x].first.second]--;
		} else {
			for (int i = p[x].first.second; i <= p[x].first.second + 2; i++) 
				cnt[p[x].first.first][i]--;
		}
	}
	void solve() {
		for (int i = 1; i <= n; i++) 
			for (int j = 1; j <= m - 2; j++) {
				bool vis = true;
				for (int k = j; k <= j + 2; k++) 
					if (c[i][k] != d[k - j]) {
						vis = false;
						break;
					}
				if (vis) p.push_back(make_pair(make_pair(i, j), 0));
			}
		for (int j = 1; j <= m; j++) 
			for (int i = 1; i <= n - 2; i++) {
				bool vis = true;
				for (int k = i; k <= i + 2; k++) 
					if (c[k][j] != d[k - i]) {
						vis = false;
						break;
					}
				if (vis) p.push_back(make_pair(make_pair(i, j), 1));
			}
		len = p.size();
		dfs(0, 0);
		printf("%d\n", ans);
	}
}

namespace Subtask2_3 {
	void solve() {
		for (int i = 2; i <= n + m; i++) {
			int sum = 0;
			memset(f, 0, sizeof(f));
			for (int j = max(1, i - m), k = i - j; j <= n && k; j++, k--) {
				f[j][0] = max(max(f[j - 1][0], f[j - 1][1]), f[j - 1][2]);
				if (c[j][k] == 'G') {
					if (c[j - 1][k] == 'R' && c[j + 1][k] == 'W') f[j][1] = max(f[j][1], max(f[j - 1][0], f[j - 1][1]) + 1);
					if (c[j][k - 1] == 'R' && c[j][k + 1] == 'W') f[j][2] = max(f[j][2], max(f[j - 1][0], f[j - 1][2]) + 1);
				}
				sum = max(max(sum, f[j][0]), max(f[j][1], f[j][2]));
			}
			ans += sum;
		}
		printf("%d\n", ans);
	}
	
}

int main() {
//	freopen("dumpling.in", "r", stdin);
//	freopen("dumpling.out", "w", stdout);
	scanf("%d%d", &n, &m);
	for (int i = 1; i <= n; i++) {
		cin >> c[i];
		c[i] = " " + c[i];
	}
	if (Subtask1::check()) Subtask1::solve();
	else Subtask2_3::solve();
	return 0;
}

Compilation message (stderr)

dango_maker.cpp: In function 'int main()':
dango_maker.cpp:94:7: warning: ignoring return value of 'int scanf(const char*, ...)' declared with attribute 'warn_unused_result' [-Wunused-result]
   94 |  scanf("%d%d", &n, &m);
      |  ~~~~~^~~~~~~~~~~~~~~~
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...