傻逼单调栈,不说了不说了哭泣
#include <bits/stdc++.h>
using namespace std;
#define SZ(x) ((int)(x).size())
int sqr(int x) {
return x * x;
}
int const N = 2005;
int a[N][N];
int up[N][N];
int n, m;
int main() {
cin >> n >> m;
for (int i = 0; i < n; ++i)
for (int j = 0; j < m; ++j)
cin >> a[i][j];
for (int j = 0; j < m; ++j) {
int ans = 1;
up[0][j] = 1;
for (int i = 1; i < n; ++i) {
if (a[i][j] != a[i - 1][j])
++ans;
else
ans = 1;
up[i][j] = ans;
}
}
auto ans = make_pair<int, int>(0, 0);
auto StaPush = [&ans] (stack<pair<int, int>>& sta, int x, int now) -> void {
int pos = now;
while (SZ(sta) > 0 && x < sta.top().first) {
auto p = sta.top();
sta.pop();
auto area1 = sqr(min(p.first, pos - p.second));
auto area2 = p.first * (pos - p.second);
ans.first = max(ans.first, area1);
ans.second = max(ans.second, area2);
now = p.second;
}
if (SZ(sta) == 0 || x > sta.top().first)
sta.push(make_pair(x, now));
};
for (int i = 0; i < n; ++i) {
auto sta = stack<pair<int, int>>();
int lastCol = 1 - a[i][0];
for (int j = 0; j < m; ++j) {
if (a[i][j] == lastCol) {
StaPush(sta, 0, j);
while (SZ(sta) > 0)
sta.pop();
sta.push(make_pair(up[i][j], j));
} else
StaPush(sta, up[i][j], j);
lastCol = a[i][j];
}
StaPush(sta, 0, m);
}
cout << ans.first << '\n' << ans.second << '\n';
return 0;
}