Codeforces Round #614 (Div. 2) C - NEKO's Maze Game

題目連接: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 }
相關文章
相關標籤/搜索