#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 time | Memory | Grader output |
|---|
| Fetching results... |
| # | Verdict | Execution time | Memory | Grader output |
|---|
| Fetching results... |
| # | Verdict | Execution time | Memory | Grader output |
|---|
| Fetching results... |
| # | Verdict | Execution time | Memory | Grader output |
|---|
| Fetching results... |
| # | Verdict | Execution time | Memory | Grader output |
|---|
| Fetching results... |
| # | Verdict | Execution time | Memory | Grader output |
|---|
| Fetching results... |