#include "bits/stdc++.h"
using namespace std;
typedef long long ll;
typedef pair<ll, ll> pll;
typedef vector<ll> vll;
const ll N = 305;
ll n, r, c, x[N], y[N], ans = 1e18, _x[N], _y[N], ps[N], pL[N][N], pR[N][N], pmx[N][N], itl[N], itr[N];
void prec() {
for (ll gl = 0; gl < n; gl++) {
for (ll gr = gl; gr < n; gr++) {
vector<ll> a;
for (ll i = gl; i <= gr; i++) a.push_back(y[i]);
sort(a.begin(), a.end());
pL[gl][gr] = a[0];
pR[gl][gr] = c - 1 - a[gr - gl];
for (ll i = 1; i < a.size(); i++) pmx[gl][gr] = max(pmx[gl][gr], a[i] - a[i - 1] - 1);
}
}
}
signed main() {
ios::sync_with_stdio(0), cin.tie(0), cout.tie(0);
cin >> r >> c >> n;
for (ll i = 0; i < n; i++) cin >> x[i] >> y[i], x[i]--, y[i]--;
iota(ps, ps + n, 0);
sort(ps, ps + n, [&](ll a, ll b) { return x[a] < x[b]; });
for (ll i = 0; i < n; i++) _x[i] = x[ps[i]], _y[i] = y[ps[i]];
for (ll i = 0; i < n; i++) swap(x[i], _x[i]), swap(y[i], _y[i]);
prec();
for (ll up = 0; up < n; up++) { // n
vll cup;
for (ll i = 0; i < n; i++) {
cup.push_back(r - 1 - x[i]);
for (ll j = i; j < n; j++) {
cup.push_back(max(0ll, abs(x[i] - x[j]) - 1 - x[up]));
}
}
sort(cup.begin(), cup.end());
cup.resize(unique(cup.begin(), cup.end()) - cup.begin());
ll il = 0, ir = -1;
vector<array<ll, 2>> s;
multiset<ll> sL, sR, smx;
ll ce = 0;
for (ll i = 0; i < n; i++) { // n^3
if (x[i] + cup[0] + 1 < r) {
while (il < n && x[il] + cup[0] < x[i] + cup[0] + 1) il++;
while (ir + 1 < n && x[ir + 1] - x[up] <= x[i] + cup[0] + 1) ir++;
itl[i] = il;
itr[i] = ir;
if (ir < il) ce++;
else {
sL.insert(pL[il][ir]);
sR.insert(pR[il][ir]);
smx.insert(pmx[il][ir]);
}
ll pr = ir;
while (pr + 1 < n) {
pr++;
s.push_back({(x[pr] - x[up]) - (x[i] + cup[0] + 1), i});
}
s.push_back({r - (x[i] + cup[0] + 1), i});
}
}
il = 0, ir = -1;
while (il < n && x[il] + cup[0] < 0) il++;
while (ir + 1 < n && x[ir + 1] - x[up] <= 0) ir++;
sort(s.begin(), s.end());
ll it = 0;
ans = min(ans, (ce ? (ll) 1e18 : max(max(pmx[il][ir], (smx.size() ? *--smx.end() : 0ll)),
max(pL[il][ir], (sL.size() ? *--sL.end() : 0ll)) +
max(pR[il][ir], (sR.size() ? *--sR.end() : 0)))) +
cup[0] + x[up]);
for (ll dn = 1; dn < cup.size(); dn++) {
while (it < s.size() && s[it][0] <= cup[dn]) {
ll i = s[it][1];
if (itr[i] < itl[i]) ce--;
else {
sL.erase(sL.find(pL[itl[i]][itr[i]]));
sR.erase(sR.find(pR[itl[i]][itr[i]]));
smx.erase(smx.find(pmx[itl[i]][itr[i]]));
}
itr[i]++;
if (itr[i] != n) {
sL.insert(pL[itl[i]][itr[i]]);
sR.insert(pR[itl[i]][itr[i]]);
smx.insert(pmx[itl[i]][itr[i]]);
}
it++;
}
while (il < n && x[il] + cup[0] < 0) il++;
while (ir + 1 < n && x[ir + 1] - x[up] <= 0) ir++;
ans = min(ans, (ce ? (ll) 1e18 : max(max(pmx[il][ir], (smx.size() ? *--smx.end() : 0ll)),
max(pL[il][ir], (sL.size() ? *--sL.end() : 0ll)) +
max(pR[il][ir], (sR.size() ? *--sR.end() : 0)))) +
cup[dn] + x[up]);
}
// for (ll dn = 0; dn < cup.size(); dn++) { // n^3
// long long mx = 0, L = 0, R = 0;
// vector<ll> cp{0, r - 1};
// for (ll i = 0; i < n; i++) { // n^4
// if (x[i] + cup[dn] < r - 1) cp.push_back(x[i] + cup[dn] + 1);
// }
// sort(cp.begin(), cp.end());
// cp.resize(unique(cp.begin(), cp.end()) - cp.begin());
// ll itl = 0, itr = -1;
// for (auto p: cp) { // n^4
// while (itl < n && x[itl] + cup[dn] < p) itl++;
// while (itr + 1 < n && x[itr + 1] - x[up] <= p) itr++;
// if (itl > itr) {
// mx = 1e18;
// break;
// }
// mx = max(mx, pmx[itl][itr]);
// L = max(L, pL[itl][itr]);
// R = max(R, pR[itl][itr]);
// }
// ans = min(ans, max(mx, L + R) + cup[dn] + x[up]);
// }
}
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... |