Codeforces Round #614 (Div. 2) C - NEKO's Maze Game
Posted ssummerzzz
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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 ",sum[1]+sum[2]+sum[3]); 52 else printf("__________________________Yes "); 53 } 54 55 return 0; 56 }
以上是关于Codeforces Round #614 (Div. 2) C - NEKO's Maze Game的主要内容,如果未能解决你的问题,请参考以下文章
Codeforces Round #614 (Div. 2)
Codeforces Round #614 (Div. 2)
Codeforces Round #614 (Div. 2)