#include "soccer.h"
#include <bits/stdc++.h>
#define ll long long
#define endl "\n"
using namespace std;
int biggest_stadium(int n, std::vector<std::vector<int>> a)
{
a.insert(a.begin(), vector<int>(n + 1, 0));
for (ll i = 1; i <= n; i++)
a[i].insert(a[i].begin(), 0);
ll pre[n + 2][n + 2], nxt[n + 2][n + 2], prer[n + 2][n + 2], nxtr[n + 2][n + 2];
for (ll i = 0; i <= n + 1; i++)
pre[0][i] = pre[i][0] = prer[0][i] = prer[i][0] = 0;
for (ll i = 1; i <= n; i++)
for (ll j = 1; j <= n; j++)
if (a[i][j])
pre[i][j] = i, prer[i][j] = j;
else
pre[i][j] = pre[i - 1][j], prer[i][j] = prer[i][j - 1];
for (ll i = 0; i <= n + 1; i++)
nxt[n + 1][i] = nxt[i][n + 1] = nxtr[i][n + 1] = nxtr[n + 1][i] = n + 1;
for (ll i = n; i >= 1; i--)
for (ll j = n; j >= 1; j--)
if (a[i][j])
nxt[i][j] = i, nxtr[i][j] = j;
else
nxt[i][j] = nxt[i + 1][j], nxtr[i][j] = nxtr[i][j + 1];
ll ans = 0;
ll pref[n + 1], pref1[n + 1], suf[n + 1], suf1[n + 1];
stack<ll> st, st1;
for (ll r = 1; r <= n; r++)
{
while (!st.empty())
st.pop();
while (!st1.empty())
st1.pop();
pref[0] = pref1[0] = 0;
st.push(0);
st1.push(0);
pre[r][0] = n + 1;
nxt[r][0] = 0;
for (ll i = 1; i <= n; i++)
{
while (!st.empty() and pre[r][st.top()] < pre[r][i])
st.pop();
while (!st1.empty() and nxt[r][st1.top()] > nxt[r][i])
st1.pop();
pref[i] = pref[st.top()] + (i - st.top()) * (r - pre[r][i]);
pref1[i] = pref1[st1.top()] + (i - st1.top()) * (nxt[r][i] - r);
st.push(i);
st1.push(i);
}
while (!st.empty())
st.pop();
while (!st1.empty())
st1.pop();
st.push(n + 1);
st1.push(n + 1);
nxt[r][n + 1] = 0;
pre[r][n + 1] = n + 1;
suf[n + 1] = suf1[n + 1] = 0;
for (ll i = n; i >= 1; i--)
{
while (!st.empty() and pre[r][st.top()] < pre[r][i])
st.pop();
while (!st1.empty() and nxt[r][st1.top()] > nxt[r][i])
st1.pop();
suf[i] = suf[st.top()] + (st.top() - i) * (r - pre[r][i]);
suf1[i] = suf1[st1.top()] + (st1.top() - i) * (nxt[r][i] - r);
st.push(i);
st1.push(i);
}
for (ll i = 1; i <= n; i++)
{
ans = max(ans, pref[i] + suf[i] + pref1[i] + suf1[i] - (nxt[r][i] - pre[r][i] - 1) - (nxtr[r][i] - prer[r][i] - 1) - 1);
// if (pref[i] + suf[i] + pref1[i] + suf1[i] - (nxt[r][i] - pre[r][i] - 1) - (nxtr[r][i] - prer[r][i] - 1) - 1 == 3)
// {
// cout << pref[i] << " " << suf[i] << " " << pref1[i] << " " << suf1[i] << " " << nxt[r][i] - pre[r][i] - 1 << " " << nxtr[r][i] << " " << prer[r][i] << endl;
// }
}
}
return 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... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |