可做题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 345 =500 67 =100000 矩阵 M 的元素在值域内等概率随机
8
9
10

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


分析:

这道题和之前hu测的T2有点像

通过手玩,我们可以发现:
一个合法的大矩阵中任意一个子矩阵都满足条件

实际上我们也可以把一个大矩阵拆成若干个2*2的小矩阵
判断每个小矩阵是否符合条件

暴力判断即可

//这里写代码片
#include<cstdio>
#include<cstring>
#include<iostream>

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;i<x+n-1;i++)
        for (int j=y;j<y+n-1;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;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值