P2701 [USACO5.3]巨大的牛棚Big Barn

首先,题目传送门:https://www.luogu.com.cn/problem/P2701

这题其实也是一个最大正方形模板题,只要加上一个预处理就OK了

预处理:

    for(int i=1;i<=n;i++)
        for(int j=1;j<=n;j++)
            b[i][j]=1;
    for(int i=1;i<=t;i++){
        int x,y; cin>>x>>y;
        b[x][y]=0;
    }

然后就是模板了:

    for(int i=1;i<=n;i++)
        for(int j=1;j<=n;j++){
            up[i][j]=1;
            r[i][j]=l[i][j]=j;
    }
    for(int i=1;i<=n;i++)
        for(int j=1;j<=n;j++)
            if(b[i][j]&&b[i][j-1]) l[i][j]=l[i][j-1];
    for(int i=1;i<=n;i++)
        for(int j=n;j>=1;j--)
            if(b[i][j]&&b[i][j+1]) r[i][j]=r[i][j+1];
    for(int i=2;i<=n;i++)
    for(int j=1;j<=n;j++){
        if(b[i][j]==b[i-1][j]==1)
        {
            up[i][j]=up[i-1][j]+1;
            l[i][j]=max(l[i][j],l[i-1][j]);
            r[i][j]=min(r[i][j],r[i-1][j]);
        }
        int s=min(up[i][j],(r[i][j]-l[i][j]+1));
        ans=max(ans,s);
    }

最后输出ans即可

你可能感兴趣的:(P2701 [USACO5.3]巨大的牛棚Big Barn)