Submission #1281360

#TimeUsernameProblemLanguageResultExecution timeMemory
1281360arashmemarVirus Experiment (JOI19_virus)C++20
6 / 100
2091 ms4168 KiB
#include <bits/stdc++.h>
using namespace std;

const int maxn = 1e3, maxm = 1e5 + 100;

int u[maxn][maxn];
bool ac[maxn][maxn], ad[maxm];

int st[16];

int conv(char c)
{
	if (c == 'N')
	{
		return 8;
	}
	if (c == 'E')
	{
		return 4;
	}
	if (c == 'S')
	{
		return 2;
	}
	return 1;
}

int get(int i, int j)
{
	int ret = 0;
	if (u[i][j] == 0)
	{
		return ret;
	}
	if (ac[i - 1][j])
	{
		ret += 8;
	}
	if (ac[i][j + 1])
	{
		ret += 4;
	}
	if (ac[i + 1][j])
	{
		ret += 2;
	}
	if (ac[i][j - 1])
	{
		ret += 1;
	}
	return ret;
}

int f(int i, int j)
{
	ac[i][j] = 1;
	int ret = 1;
	if (ac[i - 1][j] == 0 and u[i - 1][j] and st[get(i - 1, j)] >= u[i - 1][j])
	{
		ret += f(i - 1, j);
	}
	if (ac[i + 1][j] == 0 and u[i + 1][j] and st[get(i + 1, j)] >= u[i + 1][j])
	{
		ret += f(i + 1, j);
	}
	if (ac[i][j - 1] == 0 and u[i][j - 1] and st[get(i, j - 1)] >= u[i][j - 1])
	{
		ret += f(i, j - 1);
	}
	if (ac[i][j + 1] == 0 and u[i][j + 1] and st[get(i, j + 1)] >= u[i][j + 1])
	{
		ret += f(i, j + 1);
	}
	return ret;
}

int main()
{
	ios_base::sync_with_stdio(false);
	cin.tie(0);
	cout.tie(0);
	int m, r, c;
	cin >> m >> r >> c;

	string s;
	cin >> s;

	for (int N = 0;N < 2;N++)
	{
		for (int E = 0;E < 2;E++)
		{
			for (int S = 0;S < 2;S++)
			{
				for (int W = 0;W < 2;W++)
				{
					int cur = 8 * N + 4 * E + 2 * S + 1 * W;
					for (int i = 0;i < m;i++)
					{
						ad[i] = (cur & conv(s[i]));
					}
					int s = 0, mx = 0;
					for (int i = 0;i < m;i++)
					{
						if (ad[i])
						{
							s++;
						}
						else
						{
							mx = max(mx, s);
							s = 0;
						}
					}
					for (int i = 0;i < m;i++)
					{
						if (ad[i])
						{
							s++;
						}
						else
						{
							mx = max(mx, s);
							s = 0;
						}
					}
					mx = max(mx, s);
					if (mx == 2 * m)
					{
						mx = maxm;
					}
					st[cur] = mx;
				}
			}
		}
	}

	for (int i = 1;i <= r;i++)
	{
		for (int j = 1;j <= c;j++)
		{
			cin >> u[i][j];
		}
	}

	int mn = maxn * maxn, ans = 1;

	for (int i = 1;i <= r;i++)
	{
		for (int j = 1;j <= c;j++)
		{
			if (u[i][j] == 0)
			{
				continue;
			}
			for (int i = 1;i <= r;i++)
			{
				for (int j = 1;j <= c;j++)
				{
					ac[i][j] = 0;
				}
			}
			int ret = f(i, j);
			if (ret == mn)
			{
				ans++;
			}
			if (ret < mn)
			{
				mn = ret;
				ans = 1;
			}
		}
	}
	cout << mn << '\n' << ans;
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...