“codeplus比赛的时候在做什么?有没有空?能来解决停机问题吗?”qmqmqm这样问sublinekelzrip。
当然,sublinekelzrip并不会停机问题,所以qmqmqm改为提出了另一个题目,现在请你帮助sublinekelzrip解决这个题目。
这个问题是这样的:
对于任何一个 n 阶方阵,若任意从其中选择 n 个不同行不同列的位置,其上的权值之和均相等,则我们称这个矩阵是巧妙的。注意对于 n=1 的任何矩阵都是巧妙的。 例如矩阵 1amp;2amp;3\4amp;5amp;6\7amp;8amp;9 是巧妙的,因为 1+5+9=1+6+8=2+4+9=2+6+7=3+5+7=3+4+8=15 ,而矩阵 1amp;2\2amp;1 不巧妙,因为 1+1≠2+2 。
现在有一个 n×m 大小的矩阵 M 以及 T 个询问,每次询问其一个子方阵是否是巧妙的。
从标准输入读入数据。
输入第一行包含三个正整数 n,m,T 。
之后 n 行每行 m 个空格分割的非负整数,表示矩阵 M 。
之后 T 行每行 3 个正整数 x,y,k ,表示询问第 x 行第 y 列为左上角的 k 阶方阵是否是巧妙的。保证这个矩阵完全位于 M 之中。
输出到标准输出。
输出包含 T 行每行一个字符Y
或者N
。Y
表示被询问的方阵是巧妙的,N
表示不是。
3 3 4
1 1 1
1 1 1
1 1 2
1 1 2
1 1 3
2 2 2
2 1 2
Y
N
N
Y
测试点 | max(n,m) | T | 其他 |
---|---|---|---|
1 | =5 | =5 | 无 |
2 | =100 | =20 | |
3 | |||
4 | |||
5 | =500 | ||
6 | |||
7 | =100000 | 矩阵 M 的元素在值域内等概率随机 | |
8 | 无 | ||
9 | |||
10 |
对于所有的数据, 0≤Mij≤109 , 1≤x≤n , 1≤y≤m 。
分析:
这道题和之前hu测的T2有点像
通过手玩,我们可以发现:
一个合法的大矩阵中任意一个子矩阵都满足条件
实际上我们也可以把一个大矩阵拆成若干个2*2的小矩阵
判断每个小矩阵是否符合条件
暴力判断即可
//这里写代码片
#include
#include
#include
using namespace std;
const int N=505;
int a[N][N],n,m,Q,x,y,nn;
int solve(int x,int y,int n)
{
for (int i=x;i1;i++)
for (int j=y;j1;j++)
if (a[i][j]+a[i+1][j+1]!=a[i][j+1]+a[i+1][j]) return 0;
return 1;
}
int main()
{
memset(sum,0,sizeof(sum));
scanf("%d%d%d",&n,&m,&Q);
for (int i=1;i<=n;i++)
for (int j=1;j<=m;j++)
{
int x;
scanf("%d",&a[i][j]);
sum[i][j]=sum[i-1][j]+sum[i][j-1]-sum[i-1][j-1]+x;
}
for (int i=1;i<=Q;i++)
{
scanf("%d%d%d",&x,&y,&nn);
if (solve(x,y,nn)) printf("Y\n");
else printf("N\n");
}
return 0;
}