题目传送门

题目描述

输入

输出

样例

样例输入

  1.  

样例输出

  1. Yes
  2. No
  3. No
  4. No
  5. Yes

一句话题意:2*n的迷宫,从(1,1)出发到(2,n),初始时全部的都是地面,每次询问会把一个地面给变成熔浆,熔浆变成地面,熔浆不能通过,问是否可以走到。

分析

我们先开一个a数组存储每个方格当前的状态,0表示地面,1表示熔岩

在一个长度为n,宽度为2的迷宫中,有三种情况不能从(1,1)走到(2,n)

情况一
0 1 0 0 0
0 1 0 0 0
情况二
 0 1 0 0 0
0 0 1 0 0
情况三
0 0 1 0 0
0 1 0 0 0

情况一:a[1][n]和a[2][n]同时为1

情况二:a[1][n]和a[2][n+1]同时为1 或 a[2][n]和a[1][n+1]同时为1

情况三:a[1][n]和a[2][n-1]同时为1 或 a[2][n]和a[1][n-1]同时为1

在其他情况下,总能通过别的点到达(2,n)

如果我们一个一个去枚举的话,那么1e5的数据肯定会超时

所以我们可以记录一下以上三种情况出现的次数,当次数不为0时,输出No,否则输出Yes

写代码的时候再考虑一下边界问题就可以了

代码

  1. #include<cstdio>
  2. #include<cmath>
  3. #include<algorithm>
  4. #include<iostream>
  5. #include<cstring>
  6. using namespace std;
  7. const int maxn=1e5+;
  8. int ans=;
  9. int a[][maxn];
  10. int main(){
  11. int n,q;
  12. scanf("%d%d",&n,&q);
  13. for(int i=;i<=q;i++){
  14. int aa,bb;
  15. scanf("%d%d",&aa,&bb);
  16. if(a[aa][bb]==){
  17. a[aa][bb]=;
  18. if(aa==){
  19. if(a[][bb]==) ans--;
  20. if(a[][bb+]== && bb+<=n) ans--;
  21. if(a[][bb-]== && bb>) ans--;
  22. } else {
  23. if(a[][bb]==) ans--;
  24. if(a[][bb+]== && bb+<=n) ans--;
  25. if(a[][bb-]== && bb>) ans--;
  26. }//如果这个点是由岩浆变成地面的话,之前算出来的ans就要更新
  27. //因为之前形成断路的地方现在不一定还有断路
  28. if(ans==) printf("Yes\n");
  29. else printf("No\n");
  30. } else {
  31. a[aa][bb]=;
  32. if(aa==){
  33. if(a[][bb]==) ans++;
  34. if(a[][bb+]== && bb+<=n) ans++;//bb+1<=n防止超出边界
  35. if(a[][bb-]== && bb>) ans++;//bb>1防止超出边界
  36. } else {
  37. if(a[][bb]==) ans++;
  38. if(a[][bb+]== && bb+<=n) ans++;
  39. if(a[][bb-]== && bb>) ans++;
  40. }
  41. //如果这个点是由地面变成岩浆的话,之前算出来的ans就要更新
  42. //因为之前没有断路的地方现在可能会有断路
  43. if(ans==) printf("Yes\n");
  44. else printf("No\n");
  45. }
  46. }
  47. return ;
  48. }

这个代码不是很优秀,但是比较直观

如果你已经理解的话,我们可以把代码进一步简化

优化

首先是空间上的优化,我们可以开一个2*1e5的数组,将原来的两行分别用k和!k表示,跟我们写的滚动数组方法类似

其次我们可以不必要写太多判断,有些判断合并就可以

最后我们可以删去一些不必要的头文件,再用一些位运算,使代码更加简洁高效

代码

  1. #include<bits/stdc++.h>
  2. using namespace std;
  3. const int maxn=1e5+;
  4. int a[][maxn],q,ans=,n,x,y;//ans记录不能联通的区域的个数
  5. int main(){
  6. scanf("%d%d",&n,&q);
  7. while(q--){
  8. scanf("%d%d",&x,&y);
  9. x--;//x--,方便以后的!运算 ,就是把原本的1和2变成了0和1
  10. a[x][y]^=;//改变这个位置的状态 ,1^1=0,0^1=1
  11. int m=a[x][y]*-;//如果是0就是可以走,那结果就要减,1的话加
  12. ans+=m*(a[!x][y-]+a[!x][y]+a[!x][y+]);//进行ans的累加
  13. if(ans==) printf("Yes\n");
  14. else printf("No\n");
  15. }
  16. return ;
  17. }

比较

时间上虽然差不多,但内存和长度减少了不少,看代码也更清晰

最重要的是,这样写思维可以提升上去,不然那么容易过了也没什么意思

CF 1912 A NEKO's Maze Game的更多相关文章

  1. NEKO's Maze Game

    NEKO#ΦωΦ has just got a new maze game on her PC! The game's main puzzle is a maze, in the forms of a ...

  2. NEKO's Maze Game - Codeforces 题解

    题目 NEKO#ΦωΦ has just got a new maze game on her PC! The game's main puzzle is a maze, in the forms o ...

  3. Codeforces 1292A/1293C - NEKO's Maze Game

    题目大意: 有一个2*n的图 NEKO#ΦωΦ要带领mimi们从(1,1)的点走到(2,n)的点 每次会操作一个点,从可以通过到不可以通过,不可以通过到可以通过 每操作一次要回答一次NEKO#ΦωΦ能 ...

  4. 【迷宫问题】CodeForces 1292A A NEKO's Maze Game

    题目大意 vjudge链接 共两行,从(1,n)到(2,n). 每过一个时刻会有一个位置的状态变化,从能到达这个位置变成不能到达,或从不能到达变成能到达,问在每个时刻中是否能从起点到终点. 数据范围 ...

  5. 题解 CF1292A 【NEKO's Maze Game】

    有一个结论: 当 \((1,1)\) 不能抵达 \((2,n)\) 时,必定存在一个点对,这两个点的值均为真,且坐标中的 \(x\) 互异,\(y\) 的差 \(\leq 1\) 这个结论的正确性感觉 ...

  6. #614 C. NEKO's Maze Game[简易DFS,0|1转换]

    起初一直看不懂题的意思,最后看了大佬的视频讲解才明白了题的意思. 题意:每次询问重复的时候抵消上一次操作  如果是奇数次的操作则视为障碍阻挡前进 收获:0和1的转换技巧,简单搜索和巧定义全局变量,没必 ...

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

    题目链接:http://codeforces.com/contest/1293/problem/C 题目:给定一个 2*n的地图,初始地图没有岩浆,都可以走, 给定q个询问,每个询问给定一个点(x,y ...

  8. CodeForces 1292A NEKO's Maze Game(思维)

    #include <stdio.h> #include <string.h> #include <iostream> #include <string> ...

  9. CodeForces 1293 C NEKO's Maze Game

    [题目链接] [题目大意] 有一个2 ∗ n的地图,小女孩从(1,1)想移动到(2,n) 有q次询问,每次询问更改一个格子状态(是否可以通过) 只能上下左右移动而不能斜着移动,问每次操作后,是否可以移 ...

随机推荐

  1. 【python-opencv】读取、显示、写入图像

    1.读取图像 import cv2 image=cv2.imread("dog2.jpg",1) 说明: 第二个参数是一个标志,它指定了读取图像的方式. cv.IMREAD_COL ...

  2. 线性表 & 散列表

    线性表: 数据排成一条线一样的机构,每个线性表上的数据最多只有前后两个方向, 包括 数组,链表,队列,栈. 非线性表 : 数据之间并不是简单的前后关系,有二叉树.图等. 散列表(基于 数组支持按照下标 ...

  3. 【Spring Cloud 系列】 二、Spring Cloud Eureka 的第一印象

    Eureka : 翻译翻译,找到了!(惊讶语气) Spring CLoud 中的 Spring Cloud Eureka,用于 分布式项目中的服务治理.是对Netflix 套件中的Eureka 的二次 ...

  4. Dedecms中{dede:type}标签支持调用父级栏目名称

    需求: 我们用{dede:type}标签调用栏目相关内容时,同时需要调用该栏目的父级栏目的名称. {dede:type}标签的代码做了一下开发,支持这个调用了. 开发方法: 1.打开include/t ...

  5. netty实现消息中心(二)基于netty搭建一个聊天室

    前言 上篇博文(netty实现消息中心(一)思路整理 )大概说了下netty websocket消息中心的设计思路,这篇文章主要说说简化版的netty聊天室代码实现,支持群聊和点对点聊天. 此demo ...

  6. 解决GITLAB无法启动runsv no running

    可以先尝试用 systemctl start gitlab-runsvdir.service 如果冻结不动的话,就需要查看系统服务项了 systemctl -t target 如果系统正常的话,所有任 ...

  7. phoenix从入门到精通

      第一章.phoenix入门简介 1. Phoenix定义 Phoenix最早是saleforce的一个开源项目,后来成为Apache基金的顶级项目. Phoenix是构建在HBase上的一个SQL ...

  8. Mysql 视图用途、使用场景、性能问题及使用注意事项

    原文:https://blog.csdn.net/chuangxin/article/details/84574557 <SQLite权威指南>中作者是这么定义视图的:视图即是虚拟表,也称 ...

  9. UltraEdit常用技巧

    Tip 1: Alt+C 列模式可以说最初选择使用这个文本编辑软件,原因很简单,就是因为“她”具有列编辑模式.如果您还不知道什么是列编辑模式的话,我想您应该好好研究一下啦.这是一个超级“赞”的功能.在 ...

  10. c#,pagerank算法实现一

    PageRank让链接来"投票" 一个页面的“得票数”由所有链向它的页面的重要性来决定,到一个页面的超链接相当于对该页投一票.一个页面的PageRank是由所有链向它的页面(“链入 ...