Submission #1294854

#TimeUsernameProblemLanguageResultExecution timeMemory
1294854arashmemarCultivation (JOI17_cultivation)C++20
0 / 100
1 ms572 KiB
#include <bits/stdc++.h>
using namespace std;

const int maxn = 310;

bool operator < (pair <int, int> a, pair <int, int> b)
{
	return a.first < b.first or (a.first == b.first and a.second < b.second);
}

bool operator > (pair <int, int> a, pair <int, int> b)
{
	return a.first > b.first or (a.first == b.first and a.second > b.second);
}

bool operator <= (pair <int, int> a, pair <int, int> b)
{
	return a.first < b.first or (a.first == b.first and a.second <= b.second);
}

bool operator >= (pair <int, int> a, pair <int, int> b)
{
	return a.first > b.first or (a.first == b.first and a.second >= b.second);
}

bool operator == (pair <int, int> a, pair <int, int> b)
{
	return a.first == b.first and a.second == b.second;
}

pair <int, int> a[maxn];
vector <int> rs;

int ml[maxn], mr[maxn], mg[maxn];

bool v(int i, int j, int k)
{
	pair <int, int> t1, t2, t3;
	t1 = {ml[i], i};
	t2 = {ml[j], j};
	t3 = {ml[k], k};
	if (t1 < t2 or t1 < t3)
	{
		return 0;
	}

	t1 = {mr[i], i};
	t2 = {mr[j], j};
	t3 = {mr[k], k};
	if (t2 < t1 or t2 < t3)
	{
		return 0;
	}

	t1 = {mg[i], i};
	t2 = {mg[j], j};
	t3 = {mg[k], k};
	if (t3 < t2 or t1 > t3)
	{
		return 0;
	}

	return 1;
}

bool act(int i, int l, int r, int g)
{
	int ln = max(0, ml[i] - l), rn = max(0, mr[i] - r);
	if (l + ln + r + rn > max(l + r, g))
	{
		return 0;
	}

	if (mg[i] > max(l + r, g))
	{
		return 0;
	}
	return 1;
}

int main()
{
	int ans = 2e9;
	int r, c;
	cin >> r >> c;
	int n;
	cin >> n;
	for (int i = 1;i <= n;i++)
	{
		cin >> a[i].first >> a[i].second;
	}
	sort(a + 1, a + n + 1);
	rs.push_back(0);
	for (int i = 1;i <= n;i++)
	{
		if (a[i].first != rs.back())
		{
			rs.push_back(a[i].first);
		}
		ml[i] = -1;
	}

	for (int k = 1;k <= n;k++)
	{
		int i = a[k].first, j = a[k].second;
		int p = lower_bound(rs.begin(), rs.end(), i) - rs.begin();
		if (ml[p] == -1)
		{
			ml[p] = j - 1;
			mr[p] = c - j;
			continue;
		}
		mg[p] = max(mg[p], mr[p] - (c - j) - 1);
		mr[p] = c - j;
	}

	for (int i = 1;i < rs.size();i++)
	{
		for (int j = 1;j < rs.size();j++)
		{
			for (int k = 1;k < rs.size();k++)
			{
				if (!v(i, j, k))
				{
					continue;
				}
				int cl = ml[i], cr = mr[j], cg = mg[k];
				int ll = -1, lr = 0, lg = 0;
				for (int i = 1;i < rs.size();i++)
				{
					if (!act(i, cl, cr, cg))
					{
						continue;
					}

					if (ll == -1)
					{
						ll = rs[i] - 1;
						lr = r - rs[i];
						continue;
					}

					lg = max(lg, lr - (r - rs[i]) - 1);
					lr = r - rs[i];
				}
				ans = min(ans, max(cg, cl + cr) + max(lg, ll + lr));
			}
		}
	}
	cout << ans;
}
#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...