计算机学院大学生程序设计竞赛(2015’12) 1006 01 Matrix

#include<stdio.h>
#include<string.h>
#include<iostream>
#include<algorithm>
#include<math.h>
#include<map>
#include<queue>
using namespace std;

const int maxn=1000+10;
char s[maxn][maxn];
int n,m;
int c[maxn][maxn];
int sum[2*maxn][2*maxn];
int ans[maxn];

int main()
{
    int T;
    //freopen("F:\in.txt","r",stdin);
    scanf("%d",&T);
    while(T--){
        scanf("%d%d",&n,&m);
        memset(sum,0,sizeof sum);
        memset(ans,0,sizeof ans);
    //    memset(c,0,sizeof c);
        for(int i=0;i<n;i++) scanf("%s",s[i]);
        for(int i=1;i<=n;i++) for(int j=1;j<=n;j++) c[i][j]=s[i-1][j-1]-'0';

        for(int i=1;i<=2*n;i++)
            for(int j=1;j<=2*n;j++)
            {
                if(i>n||j>n)sum[i][j]=sum[i-1][j]+sum[i][j-1]-sum[i-1][j-1];
                else sum[i][j]=sum[i-1][j]+sum[i][j-1]-sum[i-1][j-1]+c[i][j];
            }


            for(int i=1;i<=n;i++)
            {
                for(int j=1;j<=n;j++)
                {
                    if(c[i][j]==0) continue;
                    int left,right,mid;
                    int anslen;
                    left=1;right=n;
                    while(left<=right)
                    {
                        mid=(left+right)/2;
                        int s=sum[i+mid-1][j+mid-1]-sum[i+mid-1][j-1]-sum[i-1][j+mid-1]+sum[i-1][j-1];
                        if(s==mid*mid)
                        {
                            anslen=mid;
                            left=mid+1;
                        }
                        else right=mid-1;
                    }
                    ans[anslen]++;
                }
            }

            for(int i=n-1;i>=1;i--) ans[i]=ans[i]+ans[i+1];
                //for(int i=1;i<=n;i++) printf("%d %d
",i,ans[i]);

            for(int i=1;i<=m;i++)
            {
                int x;
                scanf("%d",&x);
                printf("%d
",ans[x]);
            }

    }
    return 0;
}
原文地址:https://www.cnblogs.com/zufezzt/p/5080477.html