题目链接:http://codeforces.com/contest/1293/problem/C
题意:给定
的方块,从(1,1)走到(2,n)。给定q次翻转,每次将
翻转其状态,若为可行状态,则转变为不可行状态;若为不可行状态,则转变为可行状态。一开始每个方块状态都为可行。要求在每次翻转对应的方块后,寻求当前(1,1)是否可达(2,n)。
题解:添加一个点时,观察其与附件点是否增加/减少阻塞,用num记录阻塞数。如果阻塞数为0,说明当前连通,否则当前不连通。
#include<bits/stdc++.h>
using namespace std;
#define ll long long
const int maxn=100010;
bool vis[3][maxn];
int n,q,x,y;
int dx[9]={1,-1,1,1,-1,-1};
int dy[9]={1,-1,0,-1,0,1};
bool check(int x,int y){
if(1<=x&&x<=2&&1<=y&&y<=n) return 1;
return 0;
}
int cal(int x,int y){
int num=0;
for(int i=0;i<6;i++){
int xx=x+dx[i],yy=y+dy[i];
if(!check(xx,yy)) continue;
if(vis[xx][yy]) num++;
}
return num;
}
int main(){
scanf("%d%d",&n,&q);
int num=0;
while(q--){
scanf("%d%d",&x,&y);
if(vis[x][y]){
num-=cal(x,y);
}else{
num+=cal(x,y);
}
vis[x][y]=!vis[x][y];
if(!num) puts("Yes");
else puts("No");
}
return 0;
}