牛客2020 第九场 J-The Escape Plan of Groundhog(n3搞搞

题意:https://ac.nowcoder.com/acm/contest/5674/J

统计有多少矩阵四周被1包住且里面的0数和1数之差不大于1

思路:

 

n3瞎搞搞就行了

#include<bits/stdc++.h>
using namespace std;
const int N=25e4+5,M=505;
int f[N*2],s[M],a[M][M],b[M][M];
long long ans;
int main(){
    int n,m;scanf("%d%d",&n,&m);
    for(int i=1;i<=n;i++)
        for(int j=1;j<=m;j++){
            scanf("%d",a[i]+j);
            if(!a[i][j])a[i][j]=-1;
            b[i][j]=a[i][j]+b[i-1][j];
        }
    s[0]=N;
    for(int i=1;i<=n;i++){
        for(int j=i+1;j<=n;j++){
            int pre=1,k;
            for(k=1;k<=m;k++)
            {
                if(a[i][k]!=1||a[j][k]!=1)
                {
                    for(int l=pre;l<=k;l++)
                        if(b[j][l]-b[i-1][l]==j-i+1)
                            f[s[l]]--;
                    pre=k+1;s[k]=N;continue;
                }
                if(b[j][k]-b[i-1][k]==j-i+1)ans+=f[s[k-1]]+f[s[k-1]+1]+f[s[k-1]-1];
                s[k]=s[k-1]+b[j-1][k]-b[i][k];
                if(b[j][k]-b[i-1][k]==j-i+1)f[s[k]]++;
            }
            for(int l=pre;l<=m;l++)if(b[j][l]-b[i-1][l]==j-i+1)f[s[l]]--;
        }
    }
    printf("%lld",ans);
    return 0;
}

 

posted @ 2020-08-08 21:18  ZMWLxh  阅读(391)  评论(0编辑  收藏  举报