计算机学院大学生程序设计竞赛(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\n",i,ans[i]); for(int i=1;i<=m;i++) { int x; scanf("%d",&x); printf("%d\n",ans[x]); } } return 0; }