BZOJ#3039 玉蟾宫

玉蟾宫

image

思路:

将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;
}
posted @ 2022-03-29 21:01  指引盗寇入太行  阅读(31)  评论(0编辑  收藏  举报