BZOJ#3039 玉蟾宫
玉蟾宫
思路:
将f赋值为1,按列,以i,j为底的最大柱子高度,然后就可以转化成最长直方图问题,使用单调栈求解
代码:
#include <bits/stdc++.h>
#define int long long
int _= 0, Case = 1;
using namespace std;
#define all(v) begin(v),end(v)
#define nline '\n'
const int N=1010;
int a[N][N];
int l[N][N];
int r[N][N];
int t[N][N];
int n,m;
void cal1(int l[],int x){
stack<int> s;
s.push(0);
t[x][0]=-1e9;
for(int i=1;i<=m;i++){
while(s.size() and t[x][i]<=t[x][s.top()]) s.pop();
l[i]=s.top();
s.push(i);
}
}
void cal2(int r[],int x){
stack<int> s;
t[x][m+1]=-1e9;
s.push(m+1);
for(int i=m;i>=1;i--){
while(s.size() and t[x][i]<=t[x][s.top()]) s.pop();
r[i]=s.top();
s.push(i);
}
}
void solve(int Case) {
cin>>n>>m;
for(int i=1;i<=n;i++){
for(int j=1;j<=m;j++){
char c;
cin>>c;
if(c=='F') a[i][j]=1;
}
}
for(int i=1;i<=n;i++){
for(int j=1;j<=m;j++){
if(a[i][j]){
t[i][j]=t[i-1][j]+1;
}
}
cal1(l[i],i),cal2(r[i],i);
}
int res=0;
for(int i=1;i<=n;i++){
for(int j=1;j<=m;j++){
res=max(res,(r[i][j]-l[i][j]-1)*t[i][j]);
}
}
cout<<res*3<<nline;
}
signed main() {
ios::sync_with_stdio(false); cin.tie(nullptr);
// cin >> _; for (Case = 1; Case <= _; Case++)
solve(Case);
return 0;
}