题目链接:http://codeforces.com/contest/1293/problem/C
题意:给你一个2xn的矩阵,让你判断每步之后是否能从(1,1)走到(2,n),一开始都是可行走的,然后给出q次查询,每次查询的(x,y)首次出现该点是封闭的,然后该点出现则翻转变成可行走的。
思路:其实封闭后判断的是[3-x]的那条边,然后看的是[y-1],[y],[y+1]这三个点,判断即可,详解看注释
// // Created by HJYL on 2020/1/14. // #include<bits/stdc++.h> using namespace std; typedef long long ll; const int maxn=2e5+10; int main() { int n,q; int a[3][maxn]; scanf("%d%d",&n,&q); int x,y; int sum=0; for(int i=0;i<q;i++) { scanf("%d%d",&x,&y); if(a[x][y])//该点之前是封闭的,马上是可行走的 sum-=a[3-x][y-1]+a[3-x][y]+a[3-x][y+1];//sum减去相反边对应的三个点的情况 else//该点之前是可行走的,马上是封闭不可走的 sum+=a[3-x][y-1]+a[3-x][y]+a[3-x][y+1];//sum加上相反边对应的三个点的情况 if(!sum)//sum为0 则说明存在可行走的路线 printf("Yes\n"); else printf("No\n"); a[x][y]^=1;//这时候要更新点的状态,^1就是取非a[x][y],0变成1,1变成0 } return 0; }
Codeforces Round #614 (Div. 2)C - NEKO's Maze Game
原文:https://www.cnblogs.com/Vampire6/p/12219212.html