【题意】定义一个n阶正方形矩阵为“巧妙的”当且仅当:任意选择其中n个不同行列的数字之和相同。

给定n*m的矩阵,T次询问以(x,y)为左上角的k阶矩阵是否巧妙。n,m<=500,T<=10^5。

【算法】数学

【题解】

可以证明每个矩阵是巧妙的当且仅当其每个2阶子矩阵均是巧妙的:

必要性:若该矩阵有一个不巧妙的2阶子矩阵,则其他部分选择相同的情况下(不涉及此两行列),这两行列的和不同,所以该矩阵不是巧妙的。

观察一个巧妙的2阶子矩阵

a1 a2

b1 b2

由a1+b2=a2+b1,可得

a2-a1=b2-b1(列间差分相等)

b1-a1=b2-a2(行间差分相等)

充分性:若该矩阵每个2阶子矩阵都是巧妙的,则其行差分的列差分均为0(行差分相等和列差分相等)。

重定义每个数字为Mij=ai+bj,表示A(i,j)和A(i-1,j-1)的列差分和行差分分别为ai和bj,这样的矩阵不论如何选择排列,和均为Σai+Σbj,1<=i,j<=k,所以该矩阵是巧妙的。

维护二维前缀和即可。

#include<cstdio>
#define rep(i,j,k) for(int i=j;i<=k;i++)
int a[][],f[][],n,m,T,x,y,k;
int main(){
scanf("%d%d%d",&n,&m,&T);
rep(i,,n)rep(j,,m)scanf("%d",&a[i][j]);
rep(i,,n-)rep(j,,m-)f[i][j]=f[i][j-]+(a[i][j]+a[i+][j+]!=a[i+][j]+a[i][j+]);
rep(i,,n-)rep(j,,m-)f[i][j]+=f[i-][j];
while(T--){
scanf("%d%d%d",&x,&y,&k);
if(f[x+k-][y+k-]-f[x-][y+k-]-f[x+k-][y-]+f[x-][y-]>)puts("N");else puts("Y");
}
}

最新文章

  1. MailKit---获取邮件
  2. Mvc中Session导致action不异步的问题
  3. SpringBoot Schedule 配置
  4. Java(一)
  5. 如何理解JS回调函数
  6. 如何给zencart安装image handler插件?
  7. Windows2000安装Winform Clickonce提示升级系统版本的解决方案
  8. SparkSQL基础应用(1.3.1)
  9. Android手机分辨率基础知识(DPI,DIP计算)
  10. vi/vim使用指北 ---- Sample Editing
  11. gitignre
  12. java设计模式--结构型模式--装饰模式
  13. Linux 内核无线子系统
  14. C#,ASP.NET简单的MD5加密,解密
  15. jq常用功能操作
  16. docker-ce-17.09 数据卷和数据卷容器
  17. 开源项目管理工具KanBoard
  18. (字典树)How many--hdu--2609
  19. 批处理bat一键安装APK
  20. 【BZOJ3470】Freda’s Walk 概率与期望

热门文章

  1. 配置ip,使你的虚拟机可以被别人访问到,搭建服务器必备
  2. Objective - C 之延展
  3. 对scrum站立会议的理解
  4. node.js入门(二) 模块 事件驱动
  5. linux普通用户被内存被限制的问题
  6. TCP建立连接与释放连接过程中的几个问题
  7. [LeetCode] MaximumDepth of Binary Tree
  8. AngularJS中$apply
  9. 【开发工具IDE】Eclipse 安装 Maven 的 m2eclipse 插件
  10. QT uic rcc moc 命令行使用