题意:有一个2*n的网格,目的是要从(1,1)走到(2,n),给出q个询问,每个询问给出一个坐标,表示该坐标点是死胡同不能走(如果给出的这个坐标点它已经是死胡同了,那么它又会变成可走的路)每次询问后问能不能从(1,1)走到(2,n)
思路:线段树找死胡同的位置?其实不用,仔细观察会发现,假设一个点变成了死胡同,它只会对它对面的三个坐标有影响,比如(1,3)变成死胡同,那么如果对面的(2,2),(2,3),(2,4)中只要有一个是死胡同的话是不是都不能走到?所以只要记录一下死胡同cnt的数量就行,死胡同数量为0的时候才能Yes。
#include <bits/stdc++.h>
const int maxn=1e5+10;
using namespace std;
int main()
{
int l,r,n,m,s,t,p[3][maxn];
int cnt=0;
scanf("%d%d",&n,&m);
while(m--)
{
scanf("%d %d",&l,&r);
s=(l==1)?0:1;
if(!p[s][r])
{
p[s][r]=1;
t=(l==1)?1:0;
for(int i=r-1;i<=r+1;++i)
if(p[t][i]==1) cnt++;
}
else {
p[s][r]=0;
t=(l==1)?1:0;
for(int i=r-1;i<=r+1;++i)
if(p[t][i]==1) cnt--;
}
printf("%s\n",(cnt==0)?"Yes":"No");
}
}