2019-2020 ICPC, Asia Jakarta Regional Contest C. Even Path
题意:给你一个 n * n 的网格,每一行有一个价值ai,每一列有个价值bi,每个格子的价值就是该行的价值和该列的价值之和
q次询问,问你两点间,有没有存在一条路径,路过的格子全是偶数
一开始没想出来为什么行列要分开给,考虑到前缀和了没错但是一直在考虑二维前缀和,,
题目把格子拆成行,列给你肯定是要行列分别考虑,,,然后就是巧妙地01前缀和
int n,q; int a[MAXN],b[MAXN],r[MAXN],c[MAXN]; int main() { rd(n),rd(q); for(int i=1;i<=n;++i)//行 { rd(a[i]);a[i]&=1; r[i]=r[i-1]+a[i]; } for(int i=1;i<=n;++i)//列 { rd(b[i]);b[i]&=1; c[i]=c[i-1]+b[i]; } while(q--) { int x1,x2,y1,y2; rd(x1),rd(y1),rd(x2),rd(y2);//输入保证两格子价值都为偶数 //行列价值和为偶数,则坐标为(偶,偶)//(奇,奇) //要继续走只能下一个坐标也为(偶,偶)//(奇,奇) //比如该行为(偶,偶),若想往右走,(此时下一列的行价值肯定为偶) //下一列的价值只能为偶,一次则每一列都应为偶数 //奇数偶数用01表示// //利用前缀和就可以判断该行是否全为列/全为偶 if(x1>x2) swap(x1,x2); if(y1>y2) swap(y1,y2); if ((a[x1] && r[x2] - r[x1 - 1] != x2 - x1 + 1)||(!a[x1] && r[x2] - r[x1 - 1] != 0)) puts("NO"); else if ((b[y1] && c[y2] - c[y1 - 1] != y2 - y1 + 1)||(!b[y2] && c[y2] - c[y1 - 1] != 0)) puts("NO"); else puts("YES"); } //stop; return 0; }