题目:https://www.luogu.org/problemnew/show/P4030
可以发现一个矩阵是巧妙矩阵当且仅当其所有二阶子矩阵都是巧妙矩阵;
将不巧妙的二阶矩阵计为1,维护二维前缀和,查询得出当前范围内不巧妙二阶矩阵的个数,若为0则大矩阵是巧妙矩阵。
代码如下:
#include<iostream>
#include<cstdio>
using namespace std;
int a[505][505],f[505][505],n,m,t;
int main()
{
scanf("%d%d%d",&n,&m,&t);
for(int i=1;i<=n;i++)
for(int j=1;j<=m;j++)
scanf("%d",&a[i][j]);
for(int i=1;i<n;i++)
for(int j=1;j<m;j++)
{
f[i][j]=f[i][j-1]+(a[i][j]+a[i+1][j+1]!=a[i+1][j]+a[i][j+1]);
// f[i][j]+=f[i-1][j];//不对
}
for(int i=1;i<n;i++)
for(int j=1;j<m;j++)f[i][j]+=f[i-1][j];
while(t--)
{
int x,y,k;
scanf("%d%d%d",&x,&y,&k);
if(f[x+k-2][y+k-2]-f[x-1][y+k-2]-f[x+k-2][y-1]+f[x-1][y-1]==0)//x-1!y-1!
printf("Y\n");
else printf("N\n");
}
return 0;
}