分析
图中矩阵被分为了 n n n 层,不难看出:
同一层中任意两个位置之间的最短路都是它们的曼哈顿距离 ( ∣ x 1 − x 2 ∣ + ∣ y 1 − y 2 ∣ |x_1-x_2|+|y_1-y_2| ∣x1−x2∣+∣y1−y2∣)。这个距离一定是最优的。也就是说要去同一层中另一个位置,绕到别的层肯定不会更优。
我们假设每次都是从较低的层走到较高的层,每次移动最多只能向上一层,结合上面结论,我们可以得出:
每一次移动一定是在当前层中移动或向上一层,不可能向下走。
n n n 是 1 0 5 10^5 105 级别的,肯定不能将图中每个位置存下来,因为层与层之间只有两个固定入口相同(暂且称之为门)。所以如果我们要从第 i i i 层某位置 走到第 j j j 层某位置,一定要先到第 i i i 层的一个门,向上走到第 j − 1 j-1 j−1 层的一个门,再上到第 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