zoukankan      html  css  js  c++  java
  • 计算机学院大学生程序设计竞赛(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;
    }
  • 相关阅读:
    二叉树线索化。。。
    如何通过指针访问虚函数表,并且调用里面的方法
    进程间通信IPC
    什么时候该用assert
    高并发服务端分布式系统设计概要(上)
    C语言读写文件
    Linux 与 BSD 有什么不同?
    extern "C" 使用
    C语言字符数组的定义与初始化
    Linux守护进程
  • 原文地址:https://www.cnblogs.com/zufezzt/p/5080477.html
Copyright © 2011-2022 走看看