本题是老姚分享的题。
题目
解说
思维题,想明白了极其简单。
首先,考虑一下什么情况下路会被封死:
共有以上三种情况。
所以很显然我们不需要每次都从1到n找一遍有没有路,每改变一个格子的状态就检查一下另一列三个格子的状态即可。再用一个ans变量储存一下共有多少对足以堵死路的格子。ans为零则YES,否则就NO。
代码
1 #include<bits/stdc++.h> 2 using namespace std; 3 const int maxn=100000+5; 4 bool a[maxn],b[maxn]; 5 int n,q; 6 int main(){ 7 ios::sync_with_stdio(false); 8 cin>>n>>q; 9 int ans=0; 10 for(int i=1;i<=q;i++){ 11 int x,y; 12 cin>>x>>y; 13 if(x==1){ 14 if(a[y]){ 15 a[y]=0; 16 if(b[y]) ans--; 17 if(b[y+1]) ans--; 18 if(b[y-1]) ans--; 19 } 20 else{ 21 a[y]=1; 22 if(b[y]) ans++; 23 if(b[y+1]) ans++; 24 if(b[y-1]) ans++; 25 } 26 } 27 else{ 28 if(b[y]){ 29 b[y]=0; 30 if(a[y]) ans--; 31 if(a[y+1]) ans--; 32 if(a[y-1]) ans--; 33 } 34 else{ 35 b[y]=1; 36 if(a[y]) ans++; 37 if(a[y+1]) ans++; 38 if(a[y-1]) ans++; 39 } 40 } 41 if(ans) cout<<"No"<<endl; 42 else cout<<"Yes"<<endl; 43 } 44 return 0; 45 }View Code
(又找回了入门时打表的感觉)
幸甚至哉,歌以咏志。