「CodePlus 2017 12 月赛」可做题1-题解
题目地址
这个题虽然简单,但是还是有一个非常不错的小技巧,所以还是记录一下。
- 题意简述
给你一个的矩阵,我们定义一个矩阵是巧妙的,满足以下条件:
任意从其中选择 个不同行不同列的位置,其上的权值之和均相等。
例如:是巧妙的,因为满足:
而矩阵不是巧妙的,因为
每次询问你给出矩阵中的一个子矩阵是否是巧妙的。
其实不难发现,对于一个矩阵中的的一个子矩阵,例如,如果,那么对于整个矩阵,必定会有一种选法为,那么这个肯定不相等,所以这个矩阵肯定不巧妙。
所以我们预处理以每个为右下角的的矩阵是否巧妙,是的话,否则,然后维护一个的二维前缀和,每次询问一个矩阵,就是看这个矩阵里面是否有,所以就可以的完成这个题了。
#include<cstdio>
using namespace std;
const int N=510;
char c;
void read(int &x){
x=0;c=getchar();
while(c<'0'||c>'9')c=getchar();
while(c>='0'&&c<='9')x=(x<<1)+(x<<3)+(c&15),c=getchar();
}
int mp[N][N],isok[N][N],n,m,T,x,y,K,now;
int main(){
read(n);read(m);read(T);
for(int i=1;i<=n;++i)for(int j=1;j<=m;++j)read(mp[i][j]);
for(int i=2;i<=n;++i){
for(int j=2;j<=m;++j){
isok[i][j]=((mp[i][j]+mp[i-1][j-1])!=(mp[i-1][j]+mp[i][j-1]))
+(isok[i-1][j]+isok[i][j-1]-isok[i-1][j-1]);
}
}
while(T--){
read(x);read(y);read(K);
++x;++y;K-=2;
if(~K){
now=isok[x+K][y+K]-isok[x-1][y+K]-isok[x+K][y-1]+isok[x-1][y-1];
if(!now)puts("Y");
else puts("N");
}else puts("Y");
}
return 0;
}