苏子佩blog苏子佩

CF 1292A 迷宫

Su_Zipei·2020-04-04 19:23·177 次阅读

CF 1292A 迷宫

题目链接 http://codeforces.com/problemset/problem/1292/A

大意#

有一个2×n的迷宫,每次可以让一个块不能通过,问每次修改后是否可以从起点到终点/

分析1#

先说说我的想法,暴力的话O(NM),时限是1.5s,好像是差不多,但是一般卡着时间效率的代码都会T掉,所以暴力肯定不行,因为只有0和1俩状态,可以用bitset但我bitset只会用count,所以还是算了。再想的话就是考虑什么时候能从起点到终点,这道题很有意思的就是它宽度只有2,当且仅当一个块与其对着的三个块都不同时不可以通过时,即不形成墙,才可以走到,所以维护这个就好。

也就是说,当修改4时,分别判断一下1,2,3就好了,这样的话可以做到O(M)的时间复杂度,可以过。
下面讨论一下这种做法的正确性,当1-4,3-4,2-4都形成墙时,说明至少要拆三次才能通过,而拆除任意一堵墙都不能使其联通,故至少要拆三次,其他情况同理。

Copy
#include<iostream> #include<algorithm> using namespace std; const int N=1e5+10; int q[2][N]; inline int read(){ int x=0; char ch=getchar(); while(ch<'0'||ch>'9')ch=getchar(); while(ch<='9'&&ch>='0'){ x=x*10+ch-'0'; ch=getchar(); } return x; } int main(){ int cnt=0; int n=read(),m=read(); while(m--){ int a=read(),b=read(); a--; if(q[a][b]){ if(q[a^1][b-1])cnt--; if(q[a^1][b])cnt--; if(q[a^1][b+1])cnt--; }else { if(q[a^1][b-1])cnt++; if(q[a^1][b])cnt++; if(q[a^1][b+1])cnt++; } q[a][b]^=1; if(cnt)cout<<"No"<<'\n'; else cout<<"Yes"<<'\n'; } }
posted @   An_Fly  阅读(177)  评论(0编辑  收藏  举报
努力加载评论中...
编辑推荐:
· 智能桌面机器人:用.NET IoT库控制舵机并多方法播放表情
· Linux glibc自带哈希表的用例及性能测试
· 深入理解 Mybatis 分库分表执行原理
· 如何打造一个高并发系统?
· .NET Core GC压缩(compact_phase)底层原理浅谈
阅读排行:
· DeepSeek火爆全网,官网宕机?本地部署一个随便玩「LLM探索」
· 开发者新选择:用DeepSeek实现Cursor级智能编程的免费方案
· 【译】.NET 升级助手现在支持升级到集中式包管理
· 独立开发经验谈:如何通过 Docker 让潜在客户快速体验你的系统
· Tinyfox 发生重大改版
点击右上角即可分享
微信分享提示
目录