題目連接:http://codeforces.com/contest/1293/problem/Cios
題目:給定一個 2*n的地圖,初始地圖沒有岩漿,均可以走,app
給定q個詢問,每一個詢問給定一個點(x,y),每一個詢問有如下做用:spa
(1)若是該點可走,則變爲不可走code
(2)若是該點不可走,則變爲可走blog
問,每一個詢問做用後,還可否從(1,1)走到(2,n)。get
思路:咱們能夠這麼想:it
若是第二層有個沒法走的點,那麼只要該點上方三個點任意一個點不可走,則該地圖沒法走到終點。io
"若是第二層有個沒法走的點,那麼只要該點上方三個點任意一個點不可走"這句話能夠想成該點會對上面class
三個點貢獻1點,那麼第一層任意點的貢獻值爲[0,3],只要第一層有個點不可走,且第二層給它的貢獻值不爲0,test
即該地圖沒法走通。若是第二層不能走的點變爲可走了,那麼對上面三個點的貢獻度爲-1,即減去以前的1點貢獻。
1 #include <iostream> 2 #include <cstdio> 3 #include <algorithm> 4 #include <queue> 5 using namespace std; 6 7 const int N = (int)3e5+100; 8 int app[N << 1];//該點原本是否可走 9 int tot[N];//第一層的貢獻度 10 int sum[10];//貢獻度爲1,2,3的點數 11 12 int main(){ 13 14 int n,q; 15 scanf("%d%d",&n,&q); 16 int x,y; 17 while(q--){ 18 scanf("%d%d",&x,&y); 19 if(x > 1){ //第二層 20 if(!app[ n+y ]){//第二層該點原本不存在 21 app[ n+y ] = 1;//標記存在 22 for(int now = max(1,(x-1)*y-1); now <= min((x-1)*y+1,n); ++now){ 23 if(app[now]){//第一層存在 24 --sum[tot[now]]; 25 ++tot[now]; 26 ++sum[tot[now]]; 27 } 28 else ++tot[now]; 29 } 30 }else{ 31 app[ n+y ] = 0; 32 for(int now = max(1,(x-1)*y-1); now <= min((x-1)*y+1,n); ++now){ 33 if(app[now]){//第一層存在 34 --sum[tot[now]]; 35 --tot[now]; 36 ++sum[tot[now]]; 37 } 38 else --tot[now]; 39 } 40 } 41 }else{//第一層的點 42 if(app[x*y]){ 43 app[x*y] = 0; 44 --sum[tot[x*y]]; 45 } 46 else{ 47 app[x*y] = 1; 48 ++sum[tot[x*y]]; 49 } 50 } 51 if(sum[1]+sum[2]+sum[3]) printf("%d__________________________No\n",sum[1]+sum[2]+sum[3]); 52 else printf("__________________________Yes\n"); 53 } 54 55 return 0; 56 }