题目大意:
给出一个行的权值Ai 列的权值Bj, 每个位的权值之和为Ai + Bj
多次询问, 每次给出x1,y1,x2,y2
问有没有那么一条路径从(x1, y1)到(x2, y2)且路径上的权值都为偶数
解题思路:
如果起始点为奇数时,那么它走的路径上的点也必然都是奇数,否则走不通,偶数的话需要路径上都是偶数,我们可以通过这个性质求一下起点到终点的前缀和,看是否符合要求即可。
Code:
#include<iostream>
#include<cstdio>
#include<algorithm>
using namespace std;
typedef long long ll;
const int maxn=1e5+7;
int a[maxn],b[maxn],c[maxn],r[maxn];
int main(){
int n,q;
scanf("%d%d",&n,&q);
for(int i=1;i<=n;i++){
scanf("%d",&a[i]);
a[i]&=1;
r[i]=r[i-1]+a[i]; //行前缀和
}
for(int i=1;i<=n;i++){
scanf("%d",&b[i]);
b[i]&=1;
c[i]=c[i-1]+b[i]; //列前缀和
}
while(q--){
int sx,sy,ex,ey;
scanf("%d%d%d%d",&sx,&sy,&ex,&ey);
if(sx>ex) swap(sx,ex);
if(sy>ey) swap(sy,ey); //终点在右下角
if(a[sx]&&r[ex]-r[sx-1]!=ex-sx+1 || !a[sx]&&r[ex]-r[sx-1]!=0) puts("NO");
else {
if(b[sy]&&c[ey]-c[sy-1]!=ey-sy+1 || !b[sy]&&c[ey]-c[sy-1]!=0) puts("NO");
else puts("YES");
}
}
return 0;
}