您的位置:首页 > 理论基础

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

2015-12-27 17:39 232 查看
#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\n",i,ans[i]);

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

}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: