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

题目链接:http://codeforces.com/contest/1293/problem/C

题目:给定一个 2*n的地图,初始地图没有岩浆,都可以走,

给定q个询问,每个询问给定一个点(x,y),每个询问有以下作用:

(1)如果该点可走,则变为不可走

(2)如果该点不可走,则变为可走

问,每个询问作用后,还能否从(1,1)走到(2,n)。

思路:我们可以这么想:

如果第二层有个无法走的点,那么只要该点上方三个点任意一个点不可走,则该地图无法走到终点。

"如果第二层有个无法走的点,那么只要该点上方三个点任意一个点不可走"这句话可以想成该点会对上面

三个点贡献1点,那么第一层任意点的贡献值为[0,3],只要第一层有个点不可走,且第二层给它的贡献值不为0,

即该地图无法走通。如果第二层不能走的点变为可走了,那么对上面三个点的贡献度为-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 }

猜你喜欢

转载自www.cnblogs.com/SSummerZzz/p/12231764.html