题解 P4030 【「CodePlus 2017 12 月赛」可做题1】
丢一下博客链
题意:定义一个
注意到一个方阵是巧妙的当且仅当它的所有
证明显然,因为如果有一处不巧妙一定存在两种排列的和不同。
维护二维前缀和即可。
#include <cmath>
#include <queue>
#include <cstdio>
#include <iomanip>
#include <cstdlib>
#include <cstring>
#include <iostream>
#include <algorithm>
#define N 510
#define ll long long
using namespace std;
inline int read()
{
int x=0,f=1;char ch=getchar();
while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}
while(ch>='0'&&ch<='9'){x=x*10+ch-'0';ch=getchar();}
return x*f;
}
int n,m,T;
int a[N][N],f[N][N],g[N][N];
int ask_sum(int l,int r,int L,int R)
{
return g[L][R]-g[l-1][R]-g[L][r-1]+g[l-1][r-1];
}
int main()
{
n=read(),m=read(),T=read();
for(int i=1;i<=n;i++)
for(int j=1;j<=m;j++)a[i][j]=read();
for(int i=1;i<=n-1;i++)
for(int j=1;j<=m-1;j++)f[i][j]=(a[i][j]+a[i+1][j+1]==a[i+1][j]+a[i][j+1]);
for(int i=1;i<=n-1;i++)
for(int j=1;j<=m-1;j++)g[i][j]=g[i-1][j]+g[i][j-1]-g[i-1][j-1]+f[i][j];
while(T--)
{
int x=read(),y=read(),k=read();
if(k==1)
{
puts("Y");
continue ;
}
int sum=ask_sum(x,y,x+k-2,y+k-2);
if(sum==(k-1)*(k-1))puts("Y");
else puts("N");
}
}