题目大意:
有一个2*n的图
NEKO#ΦωΦ要带领mimi们从(1,1)的点走到(2,n)的点
每次会操作一个点,从可以通过到不可以通过,不可以通过到可以通过
每操作一次要回答一次NEKO#ΦωΦ能不能带领他们走到那里
解题思路:
用cnt记录不能走的种类数
两个数组,分别对应r为1和r为2
值用0和1表示能通过和不能通过
如果当前操作的是点c
如果操作完之后这个点的值变成了0(可以通过了)
那么就考虑另外一个r的数组的 c-1 c c+1 三个点的情况
如果三个点满足题意(大于等于1且小于等于n)并且点值为1(不能通过),说明这个点能和这次操作被消除的点构成一个障碍
而此时这个点变成了0,说明障碍消除了,所以不能走的种类数可以-1
总而言之,c-1 c c+1 这三个点有多少个1,拿cnt就减几
如果操作完变成了1(不能通过了)
照常,看另外一个r数组的 c-1 c c+1 这三个点有多少个1,拿cnt就加几(不能走的种类数会增加)
最后看cnt的状态
如果cnt为0则表示能走
否则不能走
#include<bits/stdc++.h> using namespace std; int a[100050],b[100050]; void solve(){ int n,q,i,x,y,cnt=0; memset(a,0,sizeof a); memset(b,0,sizeof b); cin>>n>>q; while(q--){ cin>>x>>y; if(x==1){ a[y]=1-a[y]; if(a[y]){ if(y-1>0) cnt+=b[y-1]; cnt+=b[y]; if(y+1<=n) cnt+=b[y+1]; } else{ if(y-1>0) cnt-=b[y-1]; cnt-=b[y]; if(y+1<=n) cnt-=b[y+1]; } } else{ b[y]=1-b[y]; if(b[y]){ if(y-1>0) cnt+=a[y-1]; cnt+=a[y]; if(y+1<=n) cnt+=a[y+1]; } else{ if(y-1>0) cnt-=a[y-1]; cnt-=a[y]; if(y+1<=n) cnt-=a[y+1]; } } cout<<(cnt==0?"Yes":"No")<<endl; } } int main(){ ios::sync_with_stdio(0); cin.tie(0);cout.tie(0); solve(); return 0; }