可做题1(Code+第二次网络赛)

题目背景

“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+12+2

现在有一个 n×m 大小的矩阵 M 以及 T 个询问,每次询问其一个子方阵是否是巧妙的。

输入格式

从标准输入读入数据。

输入第一行包含三个正整数 n,m,T

之后 n 行每行 m 个空格分割的非负整数,表示矩阵 M

之后 T 行每行 3 个正整数 x,y,k ,表示询问第 x 行第 y 列为左上角的 k 阶方阵是否是巧妙的。保证这个矩阵完全位于 M 之中。

输出格式

输出到标准输出。

输出包含 T 行每行一个字符Y或者NY表示被询问的方阵是巧妙的,N表示不是。

样例1输入

3 3 4
1 1 1
1 1 1
1 1 2
1 1 2
1 1 3
2 2 2
2 1 2

样例1输出

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

对于所有的数据, 0Mij109 1xn , 1ym


分析:

这道题和之前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;
}

你可能感兴趣的:(乱搞)