其实就是快速维护网格图最短路相关的东西,可以带修之类的。
Problem: 给出一个 \(n \times m\) 的网格图,格子有权值,要求支持待修改并查询两点间最短路。 \(n \le 2 \times 10^5, m \le 5, q \le 2\times 10^5\)。
考虑没有带修怎么做,分治,类似猫树分治的思想,每次求出中间一列向两侧延申的最短路,然后对于两个点,考虑经过哪个分界点,时间复杂度 \(O(m^3 n\log n + qm)\)。
带修也是一样的,使用分治结构来维护这个过程,也就是线段树。对于一个节点 \([l, r]\) 维护所有 \((l, i), (r, j)\) 的最短路矩阵 \(A\),以及所有 \((l, i), (l, j)\) 的最短路矩阵 \(L\) 和所有 \((r, i), (r, j)\) 的最短路矩阵 \(R\),并使用 \(\rm Floyd\) 合并即可。时间复杂度变成了 \(O(m^3 (q + n) \log n)\)。