CF1681E Labyrinth Adventures题解

博客解析了CF1681E题目的解决方案,重点在于如何处理图中的矩阵分层问题。作者指出,同一层内的最短路径为曼哈顿距离,并提出了从低层到高层移动的策略。为解决规模为10^5的问题,避免存储所有位置,只需关注每层的入口(门)之间的最短路径。解法包括朴素动态规划与使用倍增或线段树优化的动态规划,两者时间复杂度均为O(nlogn),但空间复杂度不同。文章提供了相关代码实现。
摘要由CSDN通过智能技术生成

分析

图中矩阵被分为了 n n n 层,不难看出:

同一层中任意两个位置之间的最短路都是它们的曼哈顿距离 ( ∣ x 1 − x 2 ∣ + ∣ y 1 − y 2 ∣ |x_1-x_2|+|y_1-y_2| x1x2+y1y2)。这个距离一定是最优的。也就是说要去同一层中另一个位置,绕到别的层肯定不会更优。

我们假设每次都是从较低的层走到较高的层,每次移动最多只能向上一层,结合上面结论,我们可以得出:

每一次移动一定是在当前层中移动或向上一层,不可能向下走。

n n n 1 0 5 10^5 105 级别的,肯定不能将图中每个位置存下来,因为层与层之间只有两个固定入口相同(暂且称之为门)。所以如果我们要从第 i i i 层某位置 走到第 j j j 层某位置,一定要先到第 i i i 层的一个门,向上走到第 j − 1 j-1 j1 层的一个门,再上到第 j j j 层走到终点。起点和终点部分的曼哈顿距离可以直接计算,所以只要记录门与门之间的最短路即可。而门的数量是 O ⁡ ( n ) \operatorname O(n) O(n) 的。


解法 1

考虑用朴素的方法求解最短路。 d i s t i , j , 0 / 1 , 0 / 1 dist_{i,j,0/1,0/1} disti,j,0/1,0/1 表示以第 i i i 层某个门作为起点,到第 j j j 层某个门的最短路。每次询问都要固定起点完整跑一遍,单次复杂度达到 O ⁡ ( n ) \operatorname O(n) O(n)

我们可以用倍增算法优化这个问题。设 d i s t i , j , 0 / 1 , 0 / 1 dist_{i,j,0/1,0/1} disti,j,0/1,0/1 表示以第 i i i 层某个门作为起点,到第 i + 2 j i+2^j i+2j 层某个门的最短路。这样对于单个起点,跑一遍最短路的复杂度是 O ⁡ ( log ⁡ n ) \operatorname O(\log n) O(logn),每次询问都可以把原区间分解成不超过 log ⁡ n \log n logn 个已知区间求解。

转化成多个区间后,维护 d p i , 0 / 1 dp_{i,0/1} dpi,0

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值