zoukankan      html  css  js  c++  java
  • Luogu4147 玉蟾宫

    正解貌似是单调栈??然而我菜只会用悬线法qwq

    悬线法

    (h(i,j))表示以((i,j))为下端点的悬线的最长长度。

    预处理(l(i,j))(r(i,j)),它们分别表示点((i,j))能扩展到的左边和右边的最近的障碍。

    答案即为(max(h(i,j)*(r(i,j)-l(i,j)+1))

    CODE:

    #include<iostream>
    #include<cstdio>
    using namespace std;
    int n, m, f[1001][1001], ans, l[1001][1001], r[1001][1001];
    int h[1001][1001];
    char qwq;
    int main(){
        scanf("%d%d", &n, &m);
        for(int i=1; i<=n; i++)
            for(int j=1; j<=m; j++){
                do qwq=getchar();while(qwq!='R'&&qwq!='F');
                if(qwq=='F')
                    f[i][j]=1;
            }
        for(int i=1; i<=n; i++){
            int t=0;
            for(int j=1; j<=m; j++)
                if(f[i][j]) l[i][j]=t;
                else l[i][j]=0, t=j;
            t=m+1;
            for(int j=m; j>0; j--)
                if(f[i][j]) r[i][j]=t;
                else r[i][j]=m+1, t=j;
        }
        for(int i=1; i<=m+1; i++)
            r[0][i]=m+1;
        for(int i=1; i<=n; i++)
            for(int j=1; j<=m; j++){
                if(f[i][j]){
                    h[i][j]=h[i-1][j]+1;
                    l[i][j]=max(l[i][j]+1, l[i-1][j]);
                    r[i][j]=min(r[i][j]-1, r[i-1][j]);
                    ans=max(ans, (r[i][j]-l[i][j]+1)*h[i][j]);
                }
            }
        printf("%d", 3*ans);
        return 0;
    }
    
  • 相关阅读:
    ZOJ 2770 Burn the Linked Camp 差分约束
    作业04 一个简单的扑克牌游戏
    C++友元
    ZOJ 3645高斯消元
    CodeForces 55D 数位统计
    03类的设计和使用
    HDU 4522
    POJ 2559单调栈
    PL/SQL REPORT 开发模拟登陆
    修改报表心得
  • 原文地址:https://www.cnblogs.com/pushinl/p/9898669.html
Copyright © 2011-2022 走看看