2*n的迷宫,从(1,1)出发到(2,n),初始时全部的都是地面,每次询问会把一个地面给变成熔浆,熔浆变成地面,熔浆不能通过,问是否可以走到。
每次变成熔浆的话只会对这个点对面的相邻的三个点,所以每次查询只需要判断是否对面的相邻的三个点是否都是地面就行。
#include<bits/stdc++.h>
using namespace std;
const int maxn=1e5+5;
const int INF=0x3f3f3f3f;
typedef long long ll;
ll n,q;
ll r,c,vis[3][maxn],step;
int main(){
cin>>n>>q;
while(q--){
cin>>r>>c;
if(!vis[r][c]){
vis[r][c]=1;
if(r==1){
if(vis[2][c]) step+=2;
if(vis[2][c-1]) step+=2;
if(vis[2][c+1]) step+=2;
}
else{
if(vis[1][c]) step+=2;
if(vis[1][c-1]) step+=2;
if(vis[1][c+1]) step+=2;
}
}
else{ //熔浆变土地
vis[r][c]=0;
if(r==1){
if(vis[2][c]) step-=2;
if(vis[2][c-1]) step-=2;
if(vis[2][c+1]) step-=2;
}
else{
if(vis[1][c]) step-=2;
if(vis[1][c-1]) step-=2;
if(vis[1][c+1]) step-=2;
}
}
if(step)
cout<<"NO"<<endl;
else
cout<<"YES"<<endl;
}
return 0;
}