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 }
相关文章
相关标签/搜索