uestc 1367#先暴力水一个再说

来源:互联网 发布:网络闹钟在线 编辑:程序博客网 时间:2024/04/30 10:33

给定n*m的0,1矩阵,有p次询问,问全部由0构成的a*b大小的子矩阵有多少个. n和m<1000


说是求0的子矩阵,程序实现改为-1的

求和

sum[i][j] 表示矩阵[1-i ][ 1-j ]

O(n^2)暴力枚举每个子矩阵

#include <stdio.h>#include <string.h>#define N 1024int mat[N][N],sum[N][N];int main(){    int m,n,p,q,i,j,ii,jj,t,cas = 0;    scanf("%d",&t);    while(t--)    {        scanf("%d%d%d%d",&m,&n,&p,&q);        memset(mat,-1,sizeof(mat));        memset(sum,0,sizeof(sum));        int x,y;        while(p--)        {            scanf("%d%d",&x,&y);            mat[x][y] = 0;        }        printf("Case #%d:\n",++cas);        for(i = 1; i <= m; ++i)            for(j = 1; j <= n; ++j)                sum[i][j] = sum[i-1][j] + sum[i][j-1] - sum[i-1][j-1] + mat[i][j];        while(q--)        {            scanf("%d%d",&x,&y);            int tmp = x * y;            int res = 0;            for(i = 1; i <= m; ++i)                for(j = 1; j <= n; ++j)                {                    if(i >= x && j >= y && sum[i][j] - sum[i][j - y] - sum[i - x][j] + sum[i - x][j - y] == -tmp)                        ++res;                    if(i >= y && j >= x && sum[i][j] - sum[i - y][j] - sum[i][j - x] + sum[i - y][j - x] == -tmp)                        ++res;                }            if(x == y)                res /= 2;            printf("%d\n",res);        }    }    return 0;}


原创粉丝点击