CF 1912 A NEKO's Maze Game
题目描述

输入

输出

样例
样例输入
样例输出
Yes
No
No
No
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
写代码的时候再考虑一下边界问题就可以了
代码
#include<cstdio>
#include<cmath>
#include<algorithm>
#include<iostream>
#include<cstring>
using namespace std;
const int maxn=1e5+;
int ans=;
int a[][maxn];
int main(){
int n,q;
scanf("%d%d",&n,&q);
for(int i=;i<=q;i++){
int aa,bb;
scanf("%d%d",&aa,&bb);
if(a[aa][bb]==){
a[aa][bb]=;
if(aa==){
if(a[][bb]==) ans--;
if(a[][bb+]== && bb+<=n) ans--;
if(a[][bb-]== && bb>) ans--;
} else {
if(a[][bb]==) ans--;
if(a[][bb+]== && bb+<=n) ans--;
if(a[][bb-]== && bb>) ans--;
}//如果这个点是由岩浆变成地面的话,之前算出来的ans就要更新
//因为之前形成断路的地方现在不一定还有断路
if(ans==) printf("Yes\n");
else printf("No\n");
} else {
a[aa][bb]=;
if(aa==){
if(a[][bb]==) ans++;
if(a[][bb+]== && bb+<=n) ans++;//bb+1<=n防止超出边界
if(a[][bb-]== && bb>) ans++;//bb>1防止超出边界
} else {
if(a[][bb]==) ans++;
if(a[][bb+]== && bb+<=n) ans++;
if(a[][bb-]== && bb>) ans++;
}
//如果这个点是由地面变成岩浆的话,之前算出来的ans就要更新
//因为之前没有断路的地方现在可能会有断路
if(ans==) printf("Yes\n");
else printf("No\n");
}
}
return ;
}
这个代码不是很优秀,但是比较直观
如果你已经理解的话,我们可以把代码进一步简化
优化
首先是空间上的优化,我们可以开一个2*1e5的数组,将原来的两行分别用k和!k表示,跟我们写的滚动数组方法类似
其次我们可以不必要写太多判断,有些判断合并就可以
最后我们可以删去一些不必要的头文件,再用一些位运算,使代码更加简洁高效
代码
#include<bits/stdc++.h>
using namespace std;
const int maxn=1e5+;
int a[][maxn],q,ans=,n,x,y;//ans记录不能联通的区域的个数
int main(){
scanf("%d%d",&n,&q);
while(q--){
scanf("%d%d",&x,&y);
x--;//x--,方便以后的!运算 ,就是把原本的1和2变成了0和1
a[x][y]^=;//改变这个位置的状态 ,1^1=0,0^1=1
int m=a[x][y]*-;//如果是0就是可以走,那结果就要减,1的话加
ans+=m*(a[!x][y-]+a[!x][y]+a[!x][y+]);//进行ans的累加
if(ans==) printf("Yes\n");
else printf("No\n");
}
return ;
}
比较

时间上虽然差不多,但内存和长度减少了不少,看代码也更清晰
最重要的是,这样写思维可以提升上去,不然那么容易过了也没什么意思
CF 1912 A NEKO's Maze Game的更多相关文章
- 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 ...
- 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 ...
- Codeforces 1292A/1293C - NEKO's Maze Game
题目大意: 有一个2*n的图 NEKO#ΦωΦ要带领mimi们从(1,1)的点走到(2,n)的点 每次会操作一个点,从可以通过到不可以通过,不可以通过到可以通过 每操作一次要回答一次NEKO#ΦωΦ能 ...
- 【迷宫问题】CodeForces 1292A A NEKO's Maze Game
题目大意 vjudge链接 共两行,从(1,n)到(2,n). 每过一个时刻会有一个位置的状态变化,从能到达这个位置变成不能到达,或从不能到达变成能到达,问在每个时刻中是否能从起点到终点. 数据范围 ...
- 题解 CF1292A 【NEKO's Maze Game】
有一个结论: 当 \((1,1)\) 不能抵达 \((2,n)\) 时,必定存在一个点对,这两个点的值均为真,且坐标中的 \(x\) 互异,\(y\) 的差 \(\leq 1\) 这个结论的正确性感觉 ...
- #614 C. NEKO's Maze Game[简易DFS,0|1转换]
起初一直看不懂题的意思,最后看了大佬的视频讲解才明白了题的意思. 题意:每次询问重复的时候抵消上一次操作 如果是奇数次的操作则视为障碍阻挡前进 收获:0和1的转换技巧,简单搜索和巧定义全局变量,没必 ...
- Codeforces Round #614 (Div. 2) C - NEKO's Maze Game
题目链接:http://codeforces.com/contest/1293/problem/C 题目:给定一个 2*n的地图,初始地图没有岩浆,都可以走, 给定q个询问,每个询问给定一个点(x,y ...
- CodeForces 1292A NEKO's Maze Game(思维)
#include <stdio.h> #include <string.h> #include <iostream> #include <string> ...
- CodeForces 1293 C NEKO's Maze Game
[题目链接] [题目大意] 有一个2 ∗ n的地图,小女孩从(1,1)想移动到(2,n) 有q次询问,每次询问更改一个格子状态(是否可以通过) 只能上下左右移动而不能斜着移动,问每次操作后,是否可以移 ...
随机推荐
- 解读三组容易混淆的Dockerfile指令
长话短说,今天分享三组容易混淆的Dockerfile指令, 帮助大家编写更优雅的Dockfile文件.构建更纯净的Docker镜像. COPY vs ADD COPY.ADD主体功能类似:从指定位置拷 ...
- Flutter学习笔记(31)--异步更新UI
如需转载,请注明出处:Flutter学习笔记(31)--异步更新UI 大家都知道,子线程不能操作UI控件,在我们Android的日常开发中,经常会遇到网络请求数据通过线程间通信,将数据发送到UI线程中 ...
- 关于宝塔面板ftp+sublime
如果sublime通过ftp上传文件传不上去,我的问题在于应该把sftp-config.json中"remote_path": "/",设置成这样.一下午.哎呀 ...
- [51nod1577]异或凑数
题目 点这里看题目. 分析 以下设\(k=\lfloor\log_2(\max a)\rfloor\). 关于异或凑数的问题自然可以用线性基处理,即如果可以插入到线性基,就说明无法凑出这个 ...
- @atcoder - ARC077F@ SS
目录 @description@ @solution@ @accepted code@ @details@ @description@ 规定一个字符串为 "偶串" 当且仅当它可以表 ...
- Linux基础:pkill命令总结
本文只总结一些常用的用法,更详细的说明见man pkill和pkill --help. pkill命令 pkill命令:通过进程名杀死进程. 语法格式 Usage: pkill [options] & ...
- Shell编译安装nginx
环境及规划 [root@nginx-node01 ~]# cat /etc/redhat-release CentOS Linux release 7.6.1810 (Core) ID 主机名 ip ...
- XAI/MLI 可解释机器学习系列1- 开源&paper汇总
一直在关注可解释机器学习领域,因为确实在工作中有许多应用 模型检查,特征重要性是否符合预期和AUC一样重要 模型解释,比起虚无缥缈的模型指标,解释模型学到的规律更能说服业务方 样本解释,为什么这些用户 ...
- Express4.x之API:express
express()表达式 express的方法 express功能分析 一.express()表达式 创建Express应用程序.express()函数是express模块导出的顶级函数.(相当于HT ...
- 2019-02-07 selenium...
今天是超级郁闷的一天 看教程 下了mysql-----配置-----不会----查资料------2小时后 mongodb-----配置------不会------查资料------1小时后 然后是各 ...